C语言共同体问题

来源:百度知道 编辑:UC知道 时间:2024/05/30 03:31:01
有如下程序:
main()
{ union
{ char ch[2];
int d;
}s;
s.d=Ox4321;
printf("%x,%x\n",s.ch[0],s.ch[1]);
}
在16位编译系统上程序执行后的输出结果是

A)21,43 B)43,21 C)43,00 D)21,00
答案是A
麻烦高手解释一下。

union所占的内存空间等于它的所有成员中最“大”的一个所占的空间。
16位机器中int占16位,char占8位,因此int与char[2]正好同样占16位。
对于机器处理整数的方法,一般有大尾序、小尾序和机器序三种做法,而C对int的一般做法是大尾序,也就是说每八位为一段,按从低位到高位,放到内存当中。因此0x4321在内存中按照0x21、0x43的次序来保存。
把s当作char数组来读取的时候,编译器找到指向s最开头的数据,然后按每八位为一个元素来读取。很显然,s.ch[0]所指向的值应该是0x21,s.ch[1]向指向的值应该是0x43。

16位机器int型数据占两个字节,所以可以和两个字符型数据构成union

int值为0x4321,高字节放0x43,低字节放0x21

union是联合体,int和char数组共用储存空间,都是占2个字节,字符数组是顺着放由低字节向高字节放,而int是作为一个整体储存,因此int的低位在高字节,高位在低字节,于是char里面的数字反过来了(另外,表示16进制是用0x不是Ox)