これらは、コロンの後に長さが示されているビットフィールドを示します
struct clap
{
int i:2; // length 2
int j:2; // length 2
int k:3; // length 3
};
ビットフィールドはスペースを節約します。計算sizeof(clap)
してみると、gcc 4.7 では 4 バイトであることがわかります。1 バイトではない理由 (2 + 2 + 3 = 7 ビット < 1 バイト) は、コンパイラが、ビットフィールドの基になる型に応じて、特定の境界に構造体を配置するためです。たとえば、ビットフィールドの基になる型にまたはとして変更int
すると、合計サイズがそれぞれ 2 バイトと 1 バイトに減少します (gcc 4.7 で再び)。short
char
clap
これは、3 つの完全な整数を格納するのに通常 12 バイトかかることと比較する必要があります (int が 4 バイトの場合)。OTOH、メンバーのアドレス指定にはビットフィールドのシフトとアンパックが必要なため、ビットフィールドを使用するとコードが遅くなる可能性があります。
符号の問題は、2 ビットの 2 の補数が -2 に等しいために発生します。コードを に拡張すると、int j:3
が出力されます2
。