2

谁能告诉我为什么断言失败?

仅供参考:我在 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) 的值相同。

我得到了解决这个问题的解决方案,但我想知道出了什么问题?

4

1 回答 1

3

看起来你想要

uint16 _8l : 8,
       _8h : 8;

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

但是这些都在一个联合中,并且联合的每个元素实际上都代表整个联合。所以它们每个都引用相同的 8 位。

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

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

然后把这个结构放入并集。

于 2012-04-04T23:11:57.650 回答