Union存储问题

jackey_option 2008-10-26 09:41:35
1.
union U{int n;char c[4];}uu;
uu.c[0]=1;uu.c[1]=1;
cout<<uu.n;
输出结果:-859045631
2.
union U{int n;char c[4];}uu;
uu.c[0]=1;uu.c[1]=1;
cout<<uu.n;
输出结果:257

各位大侠谁能解释一下
...全文
223 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jznhljg 2008-10-26
  • 打赏
  • 举报
回复
我上面 说的n没初始化...是错的.
刚看书又学习了下...呵.不好意思.从位的角度来分析这个应该就没什么问题了?
jznhljg 2008-10-26
  • 打赏
  • 举报
回复

第一个:你只初始化了c[4]的前两个.也就是低位的两个字节.高数是"随机数",也就是"垃圾值"
从位的角度来看.就是:*******..*0000000100000001 *是内存中本来就存在的"垃圾值"
所以输出每次都不一样.
第二个:你初始化了c[4]的全部.也就是四个字节都被初始化了.从字节角度来看是:0011
从位的角度来看.就是:00000...0 0000000100000001 也就是2^8+2^0=257
p.s.:你也说了,联合是在单块存储区中管理不同类型的数据.但归根到底,数据还是在用2进制01存储...
LanQuark 2008-10-26
  • 打赏
  • 举报
回复
如果调试状态编译, vc会把未赋值的字节全部设为0xC, 这样你的union值实际为0xCCCCC0101 = 3435921665 = -859045631
release态的输出可能不一样, 但是也可能固定值, 取决于程序运行的状态. 所谓随机数指的是结果按照c++语言不确定
jackey_option 2008-10-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 colaLQ 的回复:]
1. int n的低字节被设为0x0101, 高字节为随机数, -859045631 & 0x0101 = 0x0101 = 256
2. 内存碰巧被初始化为0, 所以0x0101=256
[/Quote]

不是随机数吧,我每次运行程序都是那个结果


不知道大家在自己的机器上是不是这样的结果
LanQuark 2008-10-26
  • 打赏
  • 举报
回复
写错了, 0x0101=257
LanQuark 2008-10-26
  • 打赏
  • 举报
回复
1. int n的低字节被设为0x0101, 高字节为随机数, -859045631 & 0x0101 = 0x0101 = 256
2. 内存碰巧被初始化为0, 所以0x0101=256
jackey_option 2008-10-26
  • 打赏
  • 举报
回复
不好意思修改一下:

2.
union U{int n;char c[4];}uu;
uu.c[0]=1;uu.c[1]=1; uu.c[2]=0;uu.c[3]=0;
cout < <uu.n;
输出结果:257
jackey_option 2008-10-26
  • 打赏
  • 举报
回复
当然不是什么垃圾值
因为不同变量是占用共同的存储区,只是在值输出时
会根据类型不同进行不同值的输出

看来你对Union不很了解
  • 打赏
  • 举报
回复
.....
我怎么看两段代码都一样,我没眼花吧
jznhljg 2008-10-26
  • 打赏
  • 举报
回复
联合的uu必须足够大,以保存里面类型中的最大的一种,这些类型中的任何一种都可赋给uu,
但必须保证是一致的,即读取的类型必须是最近一次存入的类型。
如果保存的类型与读取的类型不一致,其结果取决于具体的实现。
P.S:楼主的n始终没赋过值...输出的是内存中的"垃圾值"吧.

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧