union大小端模式

在c中,联合体(共用体)的数据成员都是从低地址开始存放。

例如看下面一个例子:

union demo{
	int a;
	char b;
}c;
cout<< sizeof(c)<<endl;// 4 bytes

也就是说,变量 a和b 都是占用着同样的内存空间。(就是说内存地址相同)


测试大端小端:

通过联合体所有成员起始地址一样的特点,此时,我们取其最低位的一个字节,可以发现,如果是大端,则得到的是0,如果是小端,得到的是1。

c.a = 1; // a,b的地址已经相同
return 1 == c.b;//返回1则为小端法,否则为大端法

在这里插入图片描述
这个图一下子就明白了,c.a=1时候,用32位表示是(0x) 00 00 00 01
它的01是低字节

c.a和c.b 在联合体中 公用一段内存,大小是4字节=32位,

  • 小端模式低地址放低字节,这时候c.a=1时候,地址如上图存放方式 是01 00 00 00,c.b是char类型,占用一个字节,此时取下来是0x01,c.b=1 ; 判断1 == c.b返回1 ,表示正确。

  • 大端模式时候 低地址放高字节,低字节放高地址,这时候 地址是 00 00 00 01,c.b是char类型,占用一个字节, 此时取下来是 0x00 , c.b =0; 判断1 == c.b返回0 ,表示错误不相等。


如果变为大端模式时候,c.a的值会是多少?

在此代码中,先将整型数1赋值给联合体变量c的成员a,然后使用ntohl函数将a从小端模式转换为大端模式,即将字节顺序从"01 00 00 00"转换为"00 00 00 01",如上图所示,最终得到c.a的值为16777216,即十六进制的0x01000000。


整体代码如下:

#include <stdio.h>
#include <arpa/inet.h>

union demo{
    int a;
    char b;
}c;

int main()
{
     c.a = 1; // a,b的地址已经相同
     c.a = ntohl(c.a); //小端转换为大端模式
//return 1 == c.b;//返回1则为小端法,否则为大端法
  if(c.b==1)
  {printf("小端模式,c.b=1\n");
  printf("此时c.a=%d,c.b=%d\n",c.a,c.b);}
  else
   {printf("大端模式,c.b=0\n");
   printf("此时c.a=%d,c.b=%d\n",c.a,c.b);}

   return 0;
}

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值