一道关于联合体union的题目

来源:百度知道 编辑:UC知道 时间:2024/09/25 07:22:31
#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;

void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
vc上运行得266,请给出解释

这个关键是需要理解联合的含义
就这个例子而言,a是(int型的i),和(2个char的数组x)的联合,32位平台下i的大小是4个bytes,x的大小是2个bytes,因此a的大小是4个bytes。另外,假设i的4个bytes从低到高依次是i[0]、i[1]、i[2]和i[3],那么i[0]和x[0]对应到内存的同一个byte、i[1]和x[1]对应到内存的同一个byte,即:
i[3]
i[2]
i[1] <-> x[1]
i[0] <-> x[0]

首先,全局变量a在没有显式初始化的情况下内容会被赋0,因此a.i=0,即i[3]=0,i[2]=0,i[1]=0,i[0]=0
接着的两个赋值语句,a.x[0]=10,a.x[1]=1,等于修改i[0]=10,i[1]=1,这个时候读取i,自然是1 * 256 + 10 = 266了

联合体的长度是它里面最长的元素的长度,它里面的所有元素共用一块内存.
a的最长元素是i,占用4字节,然后你给x[0]=10,x[1]=1,这就相当于i的第一个字节为10,第二个字节为1,转换成二进制就是 00000000 00000000 00000001 00001010,这就是i的四个字节的值,按十进制输出为2^8 + 2^3 + 2 = 266