第2个回答 2007-04-05
lz程序环境 TC下,
union
{ int i[2];
long k;
char c[2];
} r, *s=&r;
一个联合中的数据成员在内存中的存储是互相重叠的,每个数据成员都在相同的内存地址开始。它们共享同一块内存。union的长度为其内最长成员的长度,本题来说,在TC环境下是4个字节。
并且联合的存储是:
低地址存高位字节,高地址存低位地址。
0x12345678=0001 0010 0011 0100 0101 0110 0111 1000
八位一个字节,刚好4个字节。
按照存储原则,在读取这块内存的时候,s->c[0]指向的地址块的编码实际上是 0111 1000 所以输出 0x78;
假如输出s->c[1]指向的是 0101 0110 输出 0x56;
假如输出s->i[0]指向的是 0101 0110 0111 1000 输出5678;
假如输出s->i[1]指向的是 0001 0010 0011 0100 输出 1234;
环境是TC,如果在c++下面,鉴于现在的机器都是32位了,int变为了4个字节,所以此时这个union的长度变为了8个字节;