有人可以告诉我为什么断言失败吗?
仅供引用:我正在 64 位 Linux 机器上使用 gcc 4.6.1 编译此文件。
typedef union cpu_register {
uint64 _64;
uint32 _32;
uint16 _16;
uint16 _8l : 8,
_8h : 8;
} __attribute__((packed)) cpu_register;
int main()
{
cpu_register reg;
reg._64 = 1;
assert(reg._8h != reg._8l);
return 0;
}
reg._8h 的预期值为 0,但它与 reg._8l 的值相同 (== 1)。
我找到了解决此问题的解决方案,但我想知道出了什么问题?
最佳答案
看起来就像你想要的
uint16 _8l : 8,
_8h : 8;
为 16 位整数的低位和高位。
但是它们位于一个 union 体中,并且 union 体中的每个元素实际上代表整个 union 体。所以它们各自引用相同的 8 位。
您需要将它们包装在一个结构中:
struct {
uint16 _8l : 8,
_8h : 8;
}
然后将此结构放入 union 中。
关于c - 位域在 union 中未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10020449/