c - 位域在 union 中未按预期工作

标签 c gcc assert bit-fields unions

有人可以告诉我为什么断言失败吗?

仅供引用:我正在 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/

相关文章:

c - 我在C中的“最大回文产品”程序不起作用

c - 下面的 C 代码是否有效?

c++ - 未定义对vtable的引用

c++ - 使用复合赋值运算符解决转换警告

java - 用于测试 Java 类结构的库或框架

python - 如何使用 assertRaises() 捕获 "TypeError"

c - 如何在SDL2中旋转纹理?

c - 在菜单中制作菜单

c - mmap 是内置函数吗?

eclipse - 找不到模拟 assertEquals