- ベストアンサー
ビットフィールドについて
参考書のビットフィールドの語境界の指定という項目を読んでいるところなのですが説明に ビットフィールドは、「それを保持するに十分な大きさの任意アドレス付け可能な記憶単位に割り付け」されることになっている と書かれているのですが何度読んでもうまく理解できません。 どなたか上の文章の内容を噛み砕いて説明していただけないでしょうか わからないところがうまく言えなくてすみませんがよろしくお願いします。 参考書名:新訂 新C言語入門 シニア編(著 林晴比古)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★追記。 ・下に簡単な確認用のサンプルを載せておきます。 実際にコンパイルして確認してみて下さい。 ※int 型は 32 ビットの環境と 16 ビットの環境で結果が違いますので注意して下さい。 でも今はほとんど 32 ビットの環境ですね。あっ、Windows Vista で 64 ビット環境の 場合は int 型が 64 ビットになれば1つの int 型変数ですべてを表現できますね。 サンプル: #include <stdio.h> int main( void ) { static union { struct foo_t { int a : 4; int b : 8; int c : 12; int d : 16; } s; int n[ 3 ]; } test; test.s.a = 0xA; test.s.b = 0x89; test.s.c = 0x567; test.s.d = 0x1234; for ( int i = 0 ; i < 3 ; i++ ){ printf( "n[%d] = 0x%08X\n", i, test.n[i] ); } getchar(); return 0; } 実行結果: n[0] = 0x0056789A n[1] = 0x00001234 n[2] = 0x00000000 ※int 型が 32 ビットの環境です。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・1ビットなら1つの int 型に割り付ける。 2ビットでも1つの int 型に割り付ける。 3ビットでも1つの int 型に割り付ける。 : 32ビットまで1つの int 型に割り付ける。 となり、 33ビットなら2つの int 型に割り付ける。 34ビットでも2つの int 型に割り付ける。 35ビットでも2つの int 型に割り付ける。 : 64ビットまで2つの int 型に割り付ける。 となります。 ※ただし、int 型が 32 ビットの環境です。 int 型が 16 ビットの場合は 16 ビット単位で区切られます。 ・例えば struct foo_t { int a : 4; int b : 8; int c : 12; int d : 16; }; だと 4+8+12+16=40 ビットになりますよね。int 型が 32 ビットの環境では2つの int 変数領域を確保して 4、8、12、16 ビットとして区切られます。でも 4+8+12=24 ビットで 次の 16 ビットを足すと int 型の 32 ビットを越えます。そこで d の 16ビットは次の int 変数領域に確保されます。よって、 struct foo_t { int a : 4; int b : 8; int c : 12; int : 8; ←未使用ビット ←ここで区切られる int d : 16; int : 16; ←未使用ビット }; こんな感じになります。 ・また、ビットフィールドは処理系により int型、unsigned int型、以外にも char、short、long型が 記述できるタイプがあります。記述できない場合は警告メッセージか、エラーが表示されたりします。 ・その他、unsigned が付いていると符号なし、signed か、修飾子を指定しないと符号付きになります。 これは、 struct { int a : 8; } foo_t; ならば -4~+3 までを符号付きで扱えることになります。 ・下の『参考URL』もどうぞ。 ・以上。
お礼
わかりやすい回答ありがとうございました