ビット フィールド

構造体のメンバをビット単位で指定して、領域を節約することができます。
struct tag {
  short a:3; // 3 ビットのフィールド
  short b:4; // 4 ビットのフィールド
  short c:5; // 5 ビットのフィールド
  short d:6; // 6 ビットのフィールド
};

各メンバの型には int、short、char を指定します (ただし、ISO/JIS/ANSI で規定されているデータ型は int のみ)。signed または unsigned を付加することもできますが、その指定にかかわりなく、Light C のビット フィールドは、常に符号なし型として扱われます。

Light C では、各ビット フィールドは下位ビットから詰め込まれます。

上の例では、a、b、c の 3 つのビット フィールドが short の 16 ビット中の下位 12 ビットに詰め込まれ、a が最下位、c が最上位に置かれます。4 番目の d は同じ 16 ビットには収まらないため、次の short に格納されます。この結果、フィールドは次のように配置されます。

変数 bit15 ← ... → bit0
第 1 の short ????cccc cbbbbaaa
第 2 の short ???????? ??dddddd

ビット フィールドは、通常の整数と同じように、加減乗除やビット演算に使用できます。ただし、& 演算子でアドレスを取得したり、sizeof 演算子でサイズを取得することはできません。

通常のメンバと同じように、ビット フィールドも値リストで初期化できます。
struct {
  char a:3;
  char b:1;
} s = { 3, 1 };