具有位域的奇数结构

时间:2017-05-19 09:20:04

标签: 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的sizeof总是5,尽管所有位的总和是24。 我正在使用gcc 5.3.0。

1 个答案:

答案 0 :(得分: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;