cout<<hex<<u.i<<endl 《程序员面试宝典》的一道union题目

来源:互联网 发布:怎么选择打印机端口 编辑:程序博客网 时间:2024/06/08 22:41

#include <iostream> 
using namespace std ;

union{
 unsigned char a;
 unsigned int i;
}u;

void main()
{
 u.i = 0xf0f1f2f3;
 cout<<hex<<u.i<<endl;//hex是以16进制输出数据
 cout<<hex<<int(u.a)<<endl;
}

输出结果:

f0f1f2f3

f3

------------------------------------------------------------------------------------------------------------------

需要记住:UNION是一个联合体,各个成员共用空间,占用的空间等于其中占用空间最大的成员的SIZE。

 上题联合u中,i是int,长度为4个字节,a为char,长度为1个字节。因为他们共享一个内存,所以u在内存中实际就是f0f1f2f3.。a和i低位覆盖。


又因为:

内存中数据低位字节存入低地址,高位字节存入高地址,而数据的地址采用低地址来表示。

所以,u.i占了整个四个字节,而u.a只占了最低位的一个字节。所以u.a是0xf3.

--------------------------------------------------------------------------------------------------------------------------

应用,现在实验一下:

u.a = 'A';
 u.i = 0xf0f1f2f3;

然后再输出:

f0f1f2f3

f3

结果不变,这是因为虽然a赋值了,但是被后面赋值的i给覆盖了。

----------------------------------------------------------------------------------------------------------------------------

再变一下,假设变为:

u.i = 0xf0f1f2f3;
 u.a = 'A';

那么结果则是:

f0f1f241

41

是因为a后来的赋值覆盖了i之前的赋值的低字节,A的十六进制是41,所以输出41.