c - 带有位域的奇怪大小的结构

标签 c struct padding bit-fields packed

我正在尝试将一些位域放入 3 字节结构中

#pragma pack(push, 1)
typedef struct  _DSTEntry {
    uint8_t reserved :6;
    uint8_t startMonth:4;
    uint8_t startDay:5;
    uint8_t endMonth:4;
    uint8_t endDay:5;
} __attribute__((packed)) DSTEntry;
#pragma pop

但是,DSTEntry 的大小始终为 5,尽管所有位的总和为 24。 我使用的是 gcc 5.3.0。

最佳答案

如果您可以自由地重新排列结构中的元素,您可以尝试以下操作:

typedef struct  _DSTEntry {
    uint16_t reserved :6;
    uint16_t startDay:5;
    uint16_t endDay:5;
    uint8_t startMonth:4;
    uint8_t endMonth:4;
} __attribute__((packed)) DSTEntry;

这对我来说是尺寸 3,使用 gcc 4.9.2。如果字段必须保持该顺序,那么我认为您能做的最好的事情就是使用四个字节:

typedef struct  _DSTEntry {
    uint16_t reserved :6;
    uint16_t startDay:5;
    uint16_t startMonth:4;
    uint8_t endDay:5;
    uint8_t endMonth:4;
} __attribute__((packed)) DSTEntry;

关于c - 带有位域的奇怪大小的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44066132/

相关文章:

c - 这两种内存分配方式有什么区别呢?

c - C中逻辑或执行的顺序

plot - CorePlot 图中的外边距

image - 在 SwiftUI 中向 TextField/SecureField 添加图像,向占位符文本添加填充

c - MPI 矩阵-矩阵乘法

c - 在 LPC1788 微 Controller 上通过 CAN 接收消息时遇到问题

variables - 无法访问函数内部的全局变量

c++ - 强制 C++ 结构紧密打包

c - 为什么 C 编写的库使用这么多结构?

internet-explorer - Internet Explorer 10 和 11 中的边框半径显示问题