#include <iostream> using namespace std; union { unsigned char a; unsigned int i; }u; int main() { u.i = 0xf1f2f3f4; cout<<hex<<u.i<<endl; cout<<hex<<int(u.a)<<endl; return 0; } 谁能告诉我int(u.a)的输出结果为什么是"f4"?
先你要知道C语言处理union的方法,虽然是有两个定义,但是都是在内存的同一个地方的,但是int长度为32位(跟系统有关,我们按照32位来算),char仅为8位,所以u在内存中实际就是0xf1f2f3f4,用个简图来表示吧 f4 f3 f2 f1 由低地址到高地址按字节排列 u.i占据了整个数据大小 u.a仅仅占用前面一个字节f4,这样懂了么?所以u.a强制转换后输出16进制就是f4。u.a是个char型数据只占8位,将他强制转换成int的意义是什么?不是从内存里面扩充,只是从数据类型上面扩充,将8位数据扩充成32位,用0填充union联合体是指里面定义的各种数据共享一块内存地址,而结构体的实际长度以其中占据内存空间最大的变量计 比如该例,unsigned char 是一个字节,而unsigned int是四个字节,因此u的实际大小是4个字节,而根据高位数据占据高地址,低位数据占据低位地址的原则,u.a这个字符数据占据的是u.i的低1/4地址,在例中就是f4