C/C++:uint8_t位域行为不正确且不一致

Sim*_*Que 1 c++

我有以下代码:

struct Foo {
  uint16_t a:5;
  uint16_t b:5;
  uint16_t c:5;
};
uint16_t bits = 0xdae;
const Foo& foo = *reinterpret_cast<const Foo*>(&bits);

printf("%x %x %x\n", foo.a, foo.b, foo.c);
Run Code Online (Sandbox Code Playgroud)

当我在纸上完成时,输出就是我所期望的:

第3版

如果我使用uint32_t而不是uint16_t位域,我会得到相同的结果.

但是当我使用uint8_t位域而不是uint16_t时,我得到一个不一致的结果:

第6版

要么

第16版

两者都不正确.为什么使用uint8_t进行位域会导致这种奇怪的行为?

Jes*_*uhl 5

编译器可能会在结构成员之间添加填充(或者它可能不会自行决定),当您尝试以一堆位访问整个结构时,您不会考虑到这一点.基本上你不能这样做(行为是未定义的,你的代码只是错误).您需要按名称访问结构成员使用特定于编译器的扩展来控制布局/填充.

  • @Mgetz - 包含位域的结构布局是特定于实现的,因为您链接到的页面清楚地说明了这一点. (3认同)