C ビットフィールド 新しいページはコチラ
提供: yonewiki
(→ビットフィールド) |
|||
1行: | 1行: | ||
+ | [[C PlusPlus#Cにもあった技術|C++]]へ戻る | ||
+ | |||
+ | |||
※このページではC言語にも存在していたという意味で記事タイトルがC ビットフィールドになっていますが、<br /> | ※このページではC言語にも存在していたという意味で記事タイトルがC ビットフィールドになっていますが、<br /> | ||
[[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> | [[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> | ||
<br /> | <br /> | ||
== '''ビットフィールド''' == | == '''ビットフィールド''' == | ||
+ | |||
ビットフィールドは、int変数の型の大きさ(4Byte)をバイト単位ではなくビット単位で確保しようとするものですが、構造体の中で定義される変数をビット単位で領域を分け合うことにより利用するべきメモリサイズを節約できる技術になります。真と偽の2値を扱うためのbool型でも1バイトを消費してしまうように型の大きさがバイト単位で確保されるものになっているのですが、ビットフィールドを使うことによって、2値の表現で必要となる1ビットのbool型のような変数のための領域の確保を実現できます。他にもMIDIの要素値やマイコンのように保持可能な値の範囲が0~127や1~128であるような7bitの大きさのint型を作ったりすることも出来ます。特殊な型で、通常の変数と混用することで、桁あふれが発生しやすくなりますので、十分に留意して扱う必要が発生します。 | ビットフィールドは、int変数の型の大きさ(4Byte)をバイト単位ではなくビット単位で確保しようとするものですが、構造体の中で定義される変数をビット単位で領域を分け合うことにより利用するべきメモリサイズを節約できる技術になります。真と偽の2値を扱うためのbool型でも1バイトを消費してしまうように型の大きさがバイト単位で確保されるものになっているのですが、ビットフィールドを使うことによって、2値の表現で必要となる1ビットのbool型のような変数のための領域の確保を実現できます。他にもMIDIの要素値やマイコンのように保持可能な値の範囲が0~127や1~128であるような7bitの大きさのint型を作ったりすることも出来ます。特殊な型で、通常の変数と混用することで、桁あふれが発生しやすくなりますので、十分に留意して扱う必要が発生します。 | ||
34行: | 38行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | としても、32までしか使えないため、コンパイルエラーになります。 | |
77行: | 81行: | ||
上記のようにビットフィールド値に0を指定すると、次のint型の区切りまでビットフィールドの確保開始位置をシフトします。1bitの変数ですが、4Byteのメモリサイズを使うようにふるまいます。 | 上記のようにビットフィールド値に0を指定すると、次のint型の区切りまでビットフィールドの確保開始位置をシフトします。1bitの変数ですが、4Byteのメモリサイズを使うようにふるまいます。 | ||
+ | |||
+ | |||
+ | 指定したビットを使わないために以下のように指定してビットフィールドに隙間を設けたようなメモリ確保もできます。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | struct stBFBool{ | ||
+ | unsigned int bf1_aflag :1; | ||
+ | unsigned int :7; | ||
+ | unsigned int bf1_bflag :1; | ||
+ | unsigned int :7; | ||
+ | unsigned int bf1_cflag :1; | ||
+ | unsigned int :7; | ||
+ | unsigned int bf1_dflag :1; | ||
+ | unsigned int :7; | ||
+ | unsigned int bf1_eflag :1; | ||
+ | unsigned int :7; | ||
+ | unsigned int bf1_fflag :1; | ||
+ | unsigned int :7; | ||
+ | unsigned int bf1_gflag :1; | ||
+ | unsigned int :7; | ||
+ | … | ||
+ | unsigned int bf1_xflag :1; | ||
+ | unsigned int :7; | ||
+ | unsigned int bf1_yflag :1; | ||
+ | unsigned int :7; | ||
+ | unsigned int bf1_zflag :1; | ||
+ | unsigned int :7; | ||
+ | }; | ||
+ | </syntaxhighlight> | ||
+ | と上記のように8ビットずつの単位で1ビットの変数を作ることもできます。名前定義されていない変数に7bitを割り当てることで8bit毎のメモリ確保になるようにふるまいます。 | ||
+ | |||
+ | |||
+ | マイクロソフト固有の仕様になりますが、ビットフィールドの記述順にメモリの下位側から上位ビット側へとメモリが確保され、次の1バイト大きいアドレス番号へとメモリの確保する領域が進んでいくように処理がなされます。 | ||
+ | |||
+ | |||
+ | 絵でもかかないと意味の分からないビットフィールドについての記事でしたが、あまり使わない技術ですので、あえて絵はかきません。想像力(創造力)をはたらかせるべし! | ||
+ | |||
+ | |||
+ | [[C PlusPlus#Cにもあった技術|C++]]へ戻る |