gpt4 book ai didi

c++ - 在 C++/Arduino 的结构中打包位

转载 作者:IT老高 更新时间:2023-10-28 13:02:26 26 4
gpt4 key购买 nike

我有一个结构:

typedef struct {
uint8_t month; // 1..12 [4 bits]
uint8_t date; // 1..31 [5 bits]
uint8_t hour; // 00..23 [5 bits]
uint8_t minute; // 00..59 [6 bits]
uint8_t second; // 00..59 [6 bits]
} TimeStamp;

但我想把它打包成只占用四个字节而不是五个。

有没有办法移动位以创建更紧凑的结构?

它可能看起来不多,但它正在进入 EEPROM ,因此节省的一个字节是 4 KB 页面中额外的 512 个字节(我也可以将剩余的额外 6 位用于其他内容)。

最佳答案

您正在寻找位域。

它们看起来像这样:

typedef struct {
uint32_t month : 4; // 1..12 [4 bits]
uint32_t date : 5; // 1..31 [5 bits]
uint32_t hour : 5; // 00..23 [5 bits]
uint32_t minute : 6; // 00..59 [6 bits]
uint32_t second : 6; // 00..59 [6 bits]
} TimeStamp;

根据您的编译器,为了适应没有填充的四个字节,在这种情况下,成员的大小必须是四个字节(即 uint32_t)。否则,如果使用 uint8_t,结构成员将被填充以在每个字节边界上不溢出,从而产生五个字节的结构。将此作为一般规则应有助于防止编译器差异。

这是一个 MSDN 链接,它对位域进行了深入研究:

C++ Bit Fields

关于c++ - 在 C++/Arduino 的结构中打包位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50523515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com