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.
原题目:
-------------------------------------------------------------------------------------------------------------
#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.
相关文章推荐
- cout<<hex<<u.i<<endl 《程序员面试宝典》的一道union题目
- [细节决定B度]之回首一瞥cout<<"Hello,world"<<endl;
- STL之cout<<hex
- 类似cout<<a[len1--]<<endl;这样子的表达形式探秘
- cout<<endl;与cout<<"/n";的区别
- cout << s.c_str() << endl;和 cout << s << endl;的区别
- 语句std::cout<<std::endl的作用
- [细节决定B度]之回首一瞥cout<<"Hello,world"<<endl;
- 关于一道cout题目
- 网易2009年校园招聘--一道关于<list>的STL题目
- cout<<endl 本质探索
- char *ptr=&character; cout<<ptr<<endl;为何乱码
- 一道题目,学到了递归while实现和“<<”运算级
- 详解让C++新手闹心的语句“cout<<"Hello!"<<endl;”
- cout < <true?1:"1" < <endl;
- C语言-cout<<"123"<<"45"<<endl;
- HDOJ2057|cout<<hex,负数乱码问题,暂未解决
- 一道蛮好玩的题目——某顶尖游戏公司程序员笔试第一题(摔xbox)
- cout<<endl;什么意思?
- cout<<endl 本质解析