C++ 关于联合的问题

来源:百度知道 编辑:UC知道 时间:2024/05/11 05:08:57
#include <iostream.h>
void main()
{
union{
int a[3];
char s[12];
} u;
u.a[0]=0x20494542;
u.a[1]=0x474e494a;
u.a[2]=0x00000a21;
cout<<u.s;
cout<<sizeof(u)<<endl;
}

这个程序的执行结果,为什么是
BEI JING!
12
请高手赐教呀!

union中的每一项只是对同一块内存的不同解释。int a[3]和
char s[12]的长度都是12字节,所以cout << sizeof(u) << endl;输出12是显然的。

再来分析cout<<u.s;
你把0x20494542,0x474e494a,0x00000a21都两位两位的隔开,然后从ASCII表中查相应的字符,就是
a[0] = 空格 I E B
a[1] = G N I J
a[2] = \0 \0 换行 !

对整数的存储,WINDOWS采取little endian的规则,低位在前高位在后。这样,上面三个16进制整数存储到12字节的内存中,其字符串表示就是BEI JING!

由于是联合,所以a[3]和s[12]共用一块存储区域
int在win下占4位,char占1位 所以 4×3=1×12=12
所以两者都是12位,即该联合占用12位

所以sizeof(u)=12

0x20494542存储在内存中实际是按照"42454920"的顺讯存储
其他同理

所以s实际上等于"424549204a494e47210a0000"的十六进制码
每两位转成ASCII码就是BEI JING!
0a是回车 00是结束符

解释很漂亮,也学习下,高手啊