位域在工会中没有按预期工作

时间:2012-04-04 22:58:06

标签: 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)的值相同。

我有一个解决方案来克服这个问题,但我想知道出了什么问题?

1 个答案:

答案 0 :(得分:3)

看起来你想要

uint16 _8l : 8,
       _8h : 8;

是16位整数的低位和高位。

但是这些是联合的,并且联合的每个元素实际上代表整个联盟。所以他们每个都指的是相同的8位。

您需要将它们包装在一个结构中:

struct {
    uint16 _8l : 8,
           _8h : 8;
}

然后将此结构放入联合。