C 位字段中的字节顺序? [重复]

问题描述 投票:0回答:1

考虑

uint32_t n = 0x12345678
;存储在BE机或LE机中,如图所示;现在我有一个这样定义的结构

struct DATA {
    uint32_t a : 24;
    uint32_t b : 8;
};

int main() {
    struct DATA data;
    data.a = 0x123456;
    data.b = 0x78;
    return 0;
}

它如何存储在内存中?

c bit-fields
1个回答
1
投票

它如何存储在内存中?

多种可能性:

  • BE:无填充:0x12、0x34、0x56、0x78
  • BE:填充为偶数:0x12、0x34、0x56、...、0x78、...
  • BE:填充到四边形:0x12、0x34、0x56、...、0x78、...、...、...
  • LE:无填充:0x56、0x34、0x12、0x78
  • LE:填充为偶数:0x56、0x34、0x12、...、0x78、...
  • LE:填充到四边形:0x56、0x34、0x12、...、0x78、...、...、...
  • 其他字节序:
  • 仅对位字段定义明确的类型
    int
    unsigned
    bool
    无效。
  • 无:优化编译可以消除示例中使用的变量。
  • ...

好的代码不应该关心它如何存储在内存中。
如果代码确实需要一定的顺序,请使用

uint8_t
数组而不是位字段。


注意:许多编译器不会像示例中那样将

uint32_t
存储在奇数边界上。

© www.soinside.com 2019 - 2024. All rights reserved.