c++公用体问题

来源:百度知道 编辑:UC知道 时间:2024/06/11 06:56:17
using namespace std;

int main(void)
{
union
{
char i[2];
short int k;

}r;
r.i[0]=0;
r.i[1]=2;
cout<<r.k;
return 0;
}

为什么等于512呢? 详细点

我想,楼主问的是:为什么不是输出2而是512。

这主要是程序运行的系统字节序所决定的。
这里的概念是Big Endian和Little Endian,楼主可以再以这两个关键字查百度知道。

采用Little Endian的系统对内存的分配是:数的高位在高地址上。
r[1]的地址高于r[0],所以,r[1]里的2被认为是k的高位,r[0]里的0被认为是k的低位——所以k = 0x0200 = 512
Intel的x86机器,就是采用Little Endian的。

而同样的程序如果跑在SparC系统或是PowerPC上,由于它们用的是Big Endian,高位在低地址上,那时输出结果会是2。

主要是看内存的状态:
char i[2]占用2个字节即16个bit
short int k也占用2个字节;

数组进行赋值后的内存为:0000 0010 0000 0000
公用体就是共用内存:把上面的2进制看成短整型就是2的9次方即512;

r.i[1]=2=(00000010)2
r.i[0]=0=(00000000)2
r.k=(0000001000000000)2=0x200=512

r.i[]跟r.k占用同一块内存,这就是联合。
因此,r.i[]改变后,r.k也同时被改变了