2

誰かがアサーションが失敗する理由を教えてもらえますか?

参考:64ビットLinuxマシンでgcc4.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 に答える