真心求教一个关于共用体的问题!
昨儿老师布置了一个题,上面有这样的代码:
#include<stdio.h>
union
{
int x;
char a[2];
}pt;
int main()
{
pt.a[0]=17;
pt.a[1]=0;
printf("%d\n",pt.x );
}
答案是17,为什么是17?共用体不是一次性只能存一个数据吗?应该会覆盖……
还有就是当pt.a[1]=1,就不是17了,也不是1,这是为什么?
[解决办法]
这个union的大小是一个int占用的大小,其成员占用同一块内存区域
[解决办法]
《C和指针》P211 section 10.6中写到“联合的所有成员引用的是内存中相同的位置”,也就是说,x和a[]放在内存中相同的位置,那么你向pt.a[0]中写入17,也就相当于x和a[0]所共同指向的那块内存中的值都是17,pt.x和pt.a[0]的区别在于这些位被如何解释,是被当做数组的第一个值还是被当做一个int变量。
[解决办法]
union的内存大小取决于最大的变量大小。共有一块内存。这个里面就是int的大小。一般是4字节,而char是1个字节大小,你存了a[0]=17,a[1]=0,那么int的内存内部也就是这样排列的,17在最小端,0在大端。输出肯定是17.
[解决办法]
union成员里面,最长的就是int,union占的内存长度就是int的长度,假设占4个字节,
pt.a[0]=17;//第一个字节放17
pt.a[1]=0;//第二个字节放0,要是改成pt.a[1] = 2,那第二个字节就放2.
你这个union是全局变量,其他字节本来都是0.所以输出还是17.
[解决办法]
再给你详细点吧,
比如a[0] = 0;a[1] = 1;结果是256,每一个是一个字节,
小端模式:高字节存储在在高地址,低字节存储在低地址,左边为高字节!
0000 0001a[1] 0000 0000a[0]
把二进制0000 0001 0000 0000转换成十进制正好是256.
你先得把数转换成2进制后再这么分析,不知道明白没?