题目:
看程序写出输出结果
#include <iostream>
using namespace std;
typedef union
{
int i;
struct
{
char a;
char b;
char c;
char d;
}ch;
} test;
int main()
{
test obj;
obj.i = 0x41424344;
cout << obj.ch.a << ' ' << obj.ch.b << ' ' << obj.ch.c << ' ' << obj.ch.d<< endl;
obj.ch.a = 'a';
obj.ch.b = 'b';
obj.ch.c = 'c';
obj.ch.d = 'd';
cout << hex << obj.i << endl;
system("pause");
return 0;
}
基本概念:
这题涉及到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的顺序。
那我们来看一下以下输出会是什么
union{
short i;
char c[2];
} a;
ddd un;
a.c[1] = 20;
a.c[2] = 2;
printf("%d",un.i); //00000010 00010100 = 532
网友评论