结构体里的位域的值为何看起这么奇怪?

无名D小兵 2024-10-26 11:55:34

我在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;

结果发现联合体的结构体的成员的值是这样的:

 联合体在内存中的存储情况如下图:

有无大佬能解答一下,为何结构体的成员的值会是这般模样?

 

...全文
102 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
forever74 2024-10-27
  • 打赏
  • 举报
回复

首先,这个结构体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,继续切...
}

  • 举报
回复
@forever74 谢谢大佬
  • 打赏
  • 举报
回复
uint64_t Data;
无名D小兵 2024-10-26
  • 举报
回复
@日立奔腾浪潮微软松下联想 我不是想解决什么问题,我只是想知道出现这种现象的原因是什么。
好多渔鱼好多 2024-11-21
  • 举报
回复
@无名D小兵 出现这个现象的原因是结构体需要字节对齐

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧