2012-04-04 3 views
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)の値と同じです。

私はこの問題を克服するための解決策を得ましたが、何が間違っているかを知りたいですか?

+0

あなたの質問に言語タグ(C?)を追加してください。あなたの質問を見つけて正しい解決策を提供するのに役立ちます。 – aKzenT

+0

ええ、そのC言語、申し訳ありません、それは私の最初の投稿だったので、私はそれを逃した。 – user1314006

答えて

3

あなたは16ビット整数の低および高ビットに

uint16 _8l : 8, 
     _8h : 8; 

を望んでいたように見えます。

しかし、これらは組合に含まれ、組合の各要素は効果的に組合全体を表します。したがって、それぞれ同じ8ビットを参照します。

あなたは構造でそれらをラップする必要があります。その後、

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

と組合に、この構造を置きます。

+0

はい、私はそれを修正するために構造体を使用しました。 私はあなたが言うことを得ています。ありがとう。 – user1314006

+0

そうです、明確にするために:何がうまくいかなかったのは、uint16 _8l:8; uint16 _8h:8;組合の中に2つの変数が共用体内にある場合、それらは同じデータ、すなわち同じ8ビットを参照する。構造内の2つの変数は、異なるデータ(通常は隣接する)を参照します。 – Max

+0

もう一度ありがとう。 – user1314006

関連する問題