题目:
看程序写出输出结果
基本概念:
这题涉及到Union的内存分配问题和大小端的问题。
下面先对大小端和Union内存分配的概念进行讲述。
1. 小端模式: 字数据的高字节存放在高地址中,而字数据的低字节则存放在低地址中。
2. 大端模式: 字数据的高字节存放在低地址中,而字数据的低字节则存放在高地址中。
3. Union类型的数据所占的空间等于最大的成员所占的空间,对union 型的成员的存取都是相对于该联合体基地址(低地址)的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始,因此,大小端模式存储将会直接影响union内成员的值。
分析过程:
由于我机器是小端机器,obj.i= 0x41424344的内存存储如下:
0x0003 | 0x0002 | 0x0001 | 0x0000 |
41(‘A’) | 42(‘B’) | 43(‘C’) | 44(‘D’) |
而对于ch这个内部结构来说,ch.a对应于0000位置,ch.d对应于0003位置:
0x0003 | 0x0002 | 0x0001 | 0x0000 |
|
| |
41(‘A’) | 42(‘B’) | 43(‘C’) | 44(‘D’) |
|
|
|
Ch.d | Ch.c | Ch.b | Ch.a |
|
|
|
于是在 cout << obj.ch.a << ' ' << obj.ch.b << ' ' << obj.ch.c << ' ' << obj.ch.d<< endl;
输出结果为DCBA的顺序。
同样,当
obj.ch.a = 'a';
obj.ch.b = 'b';
obj.ch.c = 'c';
obj.ch.d = 'd';
内存的分布如下:
0x0003 | 0x0002 | 0x0001 | 0x0000 |
‘d’(64) | ‘c’(63) | ‘b’(62) | ‘a’(61) |
于是obj.i输出的值为64636261的顺序。