[MM32软件] 结构体位段定义的变量在内存中顺序是什么样的?

[复制链接]
2128|14
 楼主| 643757107 发表于 2024-9-28 12:15 | 显示全部楼层 |阅读模式
比如定义一个结构体,先定义个int a ;再定义一个 int b;
那么这两个谁在高位谁在低位?你知道吗?


598330983 发表于 2024-9-28 12:16 | 显示全部楼层
这个要看设置的大小端问题了。
598330983 发表于 2024-9-28 12:16 | 显示全部楼层
结构体中使用位段(bit field)定义的变量在内存中的顺序和排列方式会受到以下几个因素的影响:

编译器的实现:不同的编译器对位段的处理方式可能会不同,例如是从最低有效位还是最高有效位开始排列。

系统的字节序(Endianness):

小端序(Little Endian):最低有效字节存储在最低地址。
大端序(Big Endian):最高有效字节存储在最低地址。
位段的长度:位段的长度(以bit为单位)定义了变量在内存中占据的位数。通常,位段会从一个字节的低位或者高位开始分配。

对齐要求:一些平台可能有对齐要求,即要求某些数据类型按照某种字节边界对齐。编译器可能会为了满足这些对齐要求在位段之间插入填充位。
598330983 发表于 2024-9-28 12:17 | 显示全部楼层
假设你定义了一个结构体如下:
  1. struct Example {
  2.     unsigned int a : 3; // 3位
  3.     unsigned int b : 5; // 5位
  4.     unsigned int c : 8; // 8位
  5. };
  6. a 需要 3 位,b 需要 5 位,c 需要 8 位。
  7. 如果系统是小端序,变量通常从低地址向高地址填充,并且位段也按字节中的低位向高位依次排列。
  8. 假设 unsigned int 是 4 字节(32 位),这些变量会在 32 位的单元中依次排列,先填满一个单元后再用下一个。
  9. 假设在小端序系统中,a、b 和 c 的排列可能如下:
  10. [code]|       32 bits (4 bytes)       |
  11. | cccccccc | bbbbb | aaa | ......|

[/code]
但这些布局具体是怎样的会依赖于编译器的实现和平台特性。
在使用之前可以先测试一下,通过串口打印出来观察一下,然后再进行详细的操作。
eleg34ance 发表于 2024-10-23 17:50 | 显示全部楼层
结构体位段(Bit-fields)是一种在C语言中定义结构体成员的方式,允许你指定每个成员占用多少位。位段的内存布局依赖于具体的编译器实现,但通常遵循位段的定义
wamed 发表于 2024-10-23 17:54 | 显示全部楼层
编译器可能会插入填充位以满足对齐要求
twinkhahale 发表于 2024-10-23 18:54 | 显示全部楼层
位段成员的顺序:位段成员按照定义的顺序依次存储在内存中
星星点点didi 发表于 2024-10-23 20:05 | 显示全部楼层
如果一个位段成员不能完全放入当前字节中,它可能会被拆分到下一个字节
nqty 发表于 2024-10-23 21:10 | 显示全部楼层
编译器可能会在位段之间或位段之后插入填充位,以满足对齐要求
tiakon 发表于 2024-10-23 21:15 | 显示全部楼层
假设我们使用的是32位系统,且编译器按照从低位到高位的顺序存储位段:第一个字节:a 占用3位。b 占用5位,但由于a已经占用了3位,b的前2位会放在第一个字节的剩余2位中,剩下的3位放在第二个字节的前3位。第二个字节:b 的后3位。c 占用8位,放在第二个字节的剩余5位和第三个字节的3位。第三个字节:c 的后3位
ewyu 发表于 2024-10-23 22:20 | 显示全部楼层
一般来说位段成员按照定义的顺序存储
hhdhy 发表于 2024-10-24 07:56 | 显示全部楼层
其实位段可能会跨越字节边界。
teaccch 发表于 2024-10-24 10:14 | 显示全部楼层
具体的内存布局依赖于编译器的实现,因此在实际应用中,建议查阅编译器的文档以了解其具体行为
一切D都好 发表于 2024-10-24 12:54 | 显示全部楼层
这个可以利用字节长度的统计函数来统计结构体的长度啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3972

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部