ビット・フィールドは、_Bool (C)、 bool (C++)、char、signed char、unsigned char、short、 unsigned short、int、unsigned int、long、unsigned long、 long long、または unsigned long long データ型として宣言することができます。ビット・フィールドは、宣言される基本型とコンパイル・モード (32 ビットまたは 64 ビット) に応じて、常に 4 バイトまたは 8 バイトになります。
C 言語では、ビット・フィールドを、int
ではなく char または short として指定することができますが、XL C/C++
はそれらを、unsigned int としてマップします。ビット・フィールドの長さは、その基本型の長さを超えることはできません。拡張モードでは、ビット・フィールドに対して sizeof 演算子を使用することができます。
(ビット・フィールドに作用する sizeof 演算子は、常に 4 を返します。)
ビット・フィールドの長さは、その基本型の長さを超えてもかまいませんが、残りのビットはフィールドの埋め込みに使用され、値は実際には保管されません。
ただし、ビット・フィールドを含む集合体の位置合わせ規則は、指定する位置合わせ設定によって異なります。この規則については、以下で説明します。
下の例では、
#pragma options align=bit_packed struct { int a : 8; int b : 10; int c : 12; int d : 4; int e : 3; int : 0; int f : 1; char g; } A; pragma options align=reset
A のサイズは 7 バイトです。A の位置合わせは 1 バイトです。
A のレイアウトは次のようになります。
メンバー名 | バイト・オフセット | ビット・オフセット |
---|---|---|
a | 0 | 0 |
b | 1 | 0 |
c | 2 | 2 |
d | 3 | 6 |
e | 4 | 2 |
f | 5 | 0 |
g | 6 | 0 |