プログラミング言語C/C++におけるビットフィールド幅上限値の差異についてメモ。C++でも型サイズを超えるビット幅指定は避けるべき。
struct X { int m : 100; // ?? };
- C: 指定した型サイズ
sizeof(int)*CHAR_BIT
を超えてはならない。 - C++: 型サイズを超えたビット分はパディングビットとして扱われる。つまりビットフィールド・データメンバのサイズは型サイズ
sizeof(int)*CHAR_BIT
となり、残りビット数は単に構造体サイズsizeof(X)
にのみ影響する。
> gcc source.c -std=c89 -pedantic
error: width of 'm' exceeds its type
> g++ source.cpp -std=c++03 -pedantic
warning: width of 'X::m' exceeds its type [enabled by default]
同環境(sizeof(int)==4 && CHAR_BIT==8
)では、後者C++での構造体サイズsizeof(X) == 16
となった。(結果は処理系依存)
C言語
C99 6.7.2.1/p3より引用(下線部は強調)。
The expression that specifies the width of a bit-field shall be an integer constant expression with a nonnegative value that does not exceed the width of an object of the type that would be specified were the colon and expression omitted. If the value is zero, the declaration shall have no declarator.
C++言語
C++03 9.6/p1より一部引用(下線部は強調)。
(snip) The constant-expression shall be an integral constant-expression with a value greater than or equal to zero. The constant-expression may be larger than the number of bits in the object representation (3.9) of the bit-field's type; in such cases the extra bits are used as padding bits and do not participate in the value representation (3.9) of the bit-field. (snip)
関連URL