c语言共用体赋值问题
union{struct{charc1;charc2;}b;}a;为什么执行a.x=0x1234后,a.b.c1的值为0x34,a.b.c2的值为0x12;为什么是这样,...
union{ struct { char c1; char c2; }b;}a;为什么执行a.x=0x1234后,a.b.c1的值为0x34,a.b.c2的值为0x12;为什么是这样,小弟没分,十分抱歉,谢谢大家!
展开
2个回答
2014-01-08
展开全部
有没有分无所谓,本人很乐意回答你的疑惑。
共同体,顾名思义,里面的成员共享一块内存空间。
你这里面x没有写出来,估计是定义成一个整数。在32位系统下,整数占用32位内存,也就是4个字节。由于结构体里面只有两个char,所以占用两个字节的内存。共享了整数的前两个字节的内存空间。整个结构体所占用的内存就是两个成员最多的4个字节。
当我们执行a.x=0x1234的时候,这4个字节大小的空间便被这个整数填满。由于Intel X86处理器的字序原因(小尾,Little end),内存从低地址到高地址是这样被填满的。
34 12 00 00
看起来这个数字是倒过来的。
由于b.c1使用该共同体的第一个字节,所以b.c1的值为0x34,b.c2也就是0x12了,假如你的结构体有c3,c4,那么c3,c4就是00了。
这个结果和CPU的字序息息相关,有一些处理器字序是“大尾(Big end)",比如sparc,0x1234在内存中的排列是
00 00 12 34
这样,得出的结果就是c1 = 00, c2 = 00, c3 = 0x12, c4 = 0x34。
共同体,顾名思义,里面的成员共享一块内存空间。
你这里面x没有写出来,估计是定义成一个整数。在32位系统下,整数占用32位内存,也就是4个字节。由于结构体里面只有两个char,所以占用两个字节的内存。共享了整数的前两个字节的内存空间。整个结构体所占用的内存就是两个成员最多的4个字节。
当我们执行a.x=0x1234的时候,这4个字节大小的空间便被这个整数填满。由于Intel X86处理器的字序原因(小尾,Little end),内存从低地址到高地址是这样被填满的。
34 12 00 00
看起来这个数字是倒过来的。
由于b.c1使用该共同体的第一个字节,所以b.c1的值为0x34,b.c2也就是0x12了,假如你的结构体有c3,c4,那么c3,c4就是00了。
这个结果和CPU的字序息息相关,有一些处理器字序是“大尾(Big end)",比如sparc,0x1234在内存中的排列是
00 00 12 34
这样,得出的结果就是c1 = 00, c2 = 00, c3 = 0x12, c4 = 0x34。
2014-01-08
展开全部
首先:在我们常用的系统中,存放的变量经常是从右向左存放的.比如你定义了c1和c2那么在计算机内存是这样的顺序: c2,c1你的共用体好像有个问题,我没发现X的定义不过我假设你的X是个int,那么x与C2,C1共用同一块内存,这就是共用体的意思当你给x赋值,也是给C2,c1赋值,并且0x12放到了C2的位置,34放到了C1位置所以,就产生了你所说的结果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询