内存中数据的排列问题

#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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值