【问题标题】:bitfields not working as expected in an union位域在联合中未按预期工作
【发布时间】:2012-04-04 22:58:06
【问题描述】:

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

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

我找到了解决这个问题的方法,但我想知道哪里出了问题?

【问题讨论】:

  • 请在您的问题中添加语言标签 (C?),它会帮助人们找到您的问题并提供正确的解决方案。
  • 是的,它的 C 语言,抱歉这是我的第一篇文章,所以我错过了。

标签: c gcc assert bit-fields unions


【解决方案1】:

看起来像你想要的

uint16 _8l : 8,
       _8h : 8;

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

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

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

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

然后把这个结构放入union中。

【讨论】:

  • 是的,我使用结构来解决这个问题。我明白了你想说的。谢谢。
  • 对,所以澄清一下:出了问题的是你有 uint16 _8l : 8; uint16 _8h:8;工会内部。如果两个变量在一个联合中,它们引用相同的数据,即相同的 8 位。结构中的两个变量引用不同的数据(通常是相邻的)。
猜你喜欢
  • 1970-01-01
  • 2016-08-31
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 2017-01-15
相关资源
最近更新 更多