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则为小端法,否则为大端法

union大小端模式_第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 
#include 

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;
}

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

你可能感兴趣的:(C语言程序设计,c语言)