ビットフィールド・パックした構造体

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
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) {・・・;} などの判定ができません。

スポンサーリンク
 
スポンサーリンク