70,020
社区成员




我在STM32的C语言代码里定义了一个这样的联合体指针bit_field:
typedef union _union_bit_field
{
struct Struct
{
uint16_t a:10;
uint16_t b:10;
uint8_t c:3;
uint8_t d:1;
uint8_t e:4;
uint8_t f:4;
}Struct1;
uint32_t Data;
}union_bit_field;
union_bit_field *bit_field;
又定义了一个数组:
uint8_t recvbuf[4]={0x12, 0x34, 0x56, 0x78};
然后让bit_field指向recvbuf:
bit_field=(union_bit_field*)recvbuf;
结果发现联合体的结构体的成员的值是这样的:
联合体在内存中的存储情况如下图:
有无大佬能解答一下,为何结构体的成员的值会是这般模样?
首先,这个结构体4个字节不够,sizeof一下就行。
其次,小端系统上,高位存在高地址,看Data知道。
最后,struct的一般习性(不排除有特殊的)是,
{
先看a前面的类型,uint16_t,好的,拿来16位数据也就是0x3412,也就是 0011 0100 0001 0010
然后看:10,所以从尾巴上切10位给a,00 0001 0010,0x0012
还剩下6位,看看b后面是:10,叹气——只剩6不够用了,算了,拿新的吧。
第二次看b前面的类型(因为b还没解决掉),拿来16位数据0x7856,也就是0111 1000 0101 0110
然后又看b后面的:10,从尾巴上切10位给b,00 0101 0110,0x0056
还剩下6位,0111 10,看看c后面是:3,还够用,从尾巴上切3位给c,110,0x06,毫无破绽。
还剩下3位,011,看看d后面是:1,还够用,从尾巴上切一个1给d,0x01就有了。
还剩下2位,看看e后面是:4,叹气——只剩2不够用了,算了,拿新的吧。
新的是0xC5,继续切...
}
uint64_t Data;