位域和大小端
intel 小端,使用位域从低字节开始赋值,赋值内还是从高位到低位
#include <stdio.h>
union{
int data1;
char data2;
}Endian;
int BigLittle()
{
Endian.data1 = 0x12345678;
printf("%x \n", Endian.data2);
return 0;
}
typedef struct{
int first:8;
int second:16;
int third:8;
}HighLow;
int highLowTest()
{
int data = 0x12345678;
HighLow *pHighLow = (HighLow *)(&data);
printf("%x %x %x\n",pHighLow->first,pHighLow->second,pHighLow->third);
return 0;
}
int main()
{
BigLittle();
highLowTest();
printf("hello, world.\n");
getchar();
getchar();
return 0;
}
输出:
/*RC /? 5.2.3690.0*/
0x78是低字节,在低地址,小端
0x78是低字节,在低地址,赋值也从0x78开始,0x3456两个字节
猜想:
1. 位域始终是从低地址开始赋值的,得到的结果和处理器的大小端有关
0001 0010 | 0011 0100 0101 0110 | 0111 1000 |
8bit | 16bit | 8bit |
如果
typedef struct{
unsigned int first:7;
unsigned int second:12;
unsigned int third:13;
}HighLow;
从最低地址开始数,
0001 0010 0011 0 | 100 0101 0110 0 | 111 1000 |
13bit | 12bit | 7bit |
输出: 0x78 0x8ac 0x246
红红火火 |
恍恍惚惚 |