ビットフィールド・パックした構造体
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
構造体・struct/構造体の宣言と初期化で例に出した構造体は、パックされていない構造体です。
パックとは、データをバイナリ形式に変換したものです。
スポンサーリンク
たとえば、以下の構造体は、2バイト(int型のバイト数)のint型が、3つありますから、計6バイトを消費します。(16ビットのコンパイラの場合)
struct item { unsigned int display; // 0 or 1 unsigned int checked; // 0 or 1 unsigned int count; // カウント数 };
ビットフィールドの追加
しかし、実際には、display、checked、は1ビットのデータでよいので、領域を無駄使いすることになります。
countを14ビット(16383)までとすると、実際には、合計16ビット(2バイト)で構造体のメンバを割り当てることが可能です。
そのためには、以下のように、メンバの後ろに「:」(セミコロン)をビット数を追加して(ビットフィールド)、構造体を定義します。
struct item { unsigned int display:1; // 0 or 1 unsigned int checked:1; // 0 or 1 unsigned int count:14; // カウント数 };
ビットフィールドを追加できるのは、int型、enum型のみのデータ型です。
文字列型や浮動小数点型には、ビットフィールドは追加できません。
パックした構造体は、ビットフィールドでのフラグとして利用できます。
struct iostatus { char iochar; unsigned int error:1; unsigned int input_error:1; unsigned int output_error:1; } flug;
フラグとしてビットフィールドを追加する場合は、符号なしのint型として、unsignedを宣言したほうが良いです。。
int error:1;として、符号ありのフラグ構造体としますと。
ビット 10進数値
1 ⇒ -1
0 ⇒ 0
となり、if (flug.error == 1) {・・・;} などの判定ができません。
スポンサーリンク
>> 次の記事 : 構造体の配列
<< 前の記事 : 列挙(列挙型)・enum
スポンサーリンク