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