您的位置:首页 > 职场人生

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

2013-10-12 16:18 309 查看
转自:http://blog.sina.com.cn/s/blog_8af1069601012csm.html

原题目:

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

#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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: