打印
[MM32软件]

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

[复制链接]
98|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
假设你定义了一个结构体如下:
struct Example {
    unsigned int a : 3; // 3位
    unsigned int b : 5; // 5位
    unsigned int c : 8; // 8位
};
a 需要 3 位,b 需要 5 位,c 需要 8 位。
如果系统是小端序,变量通常从低地址向高地址填充,并且位段也按字节中的低位向高位依次排列。
假设 unsigned int 是 4 字节(32 位),这些变量会在 32 位的单元中依次排列,先填满一个单元后再用下一个。
假设在小端序系统中,a、b 和 c 的排列可能如下:
[code]|       32 bits (4 bytes)       |
| cccccccc | bbbbb | aaa | ......|

[/code]
但这些布局具体是怎样的会依赖于编译器的实现和平台特性。
在使用之前可以先测试一下,通过串口打印出来观察一下,然后再进行详细的操作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

209

主题

3772

帖子

11

粉丝