0

我正在尝试将一些位域放入 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

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

4

1 回答 1

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;
于 2017-06-13T03:31:08.913 回答