質問: {0000 0000 0001 0000} */ ``` 0x0010と0x00f0の論理積なので答えは0x0010であり、0001の4ビットをsample.var_aに代入できると思っていました。({0000 0000 |0001| 0000}の||で囲んだ4ビットのこと) printf("%x \n",sample.var_a);で出力すると、実際には0が代入されていました。 {0000 0000 00001 |0000|}の(0,1,2,3)bitの0000を代入していたと後から気づいたのですが、これを(4,5,6,7)bitの0001をsample.var_aに代入することはできないのでしょうか。 追記: 一部、誤字があったので修正です。 ``` struct Sample hoge; ``` ではなく、 ``` struct Sample sample; ``` でした。 書いていた途中で変えてしまっていました。わかりにくいようにしてしまい大変失礼いたしました。
回答: 言語仕様的な話をすると * ビットフィールドのデータ型は`_Bool`、`signed int`、`unsigned int`のいずれかであり、他の型を使用できるかは実装依存です。 * ビットフィールドのビット配置も実装依存であり`var_a`が何ビット目に収められるかの保証はありません。 といった事情もあり、移植性のあるコードを書こうとする場合にもビットフィールドを使用せず、直接シフト・ビット演算した方がいいこともあります。