ビット・フィールドの使用と位置合わせ

ビット・フィールドは、_Bool (C)、 bool (C++)、charsigned charunsigned charshortunsigned shortintunsigned intlongunsigned longlong long、または unsigned long long データ型として宣言することができます。ビット・フィールドは、宣言される基本型とコンパイル・モード (32 ビットまたは 64 ビット) に応じて、常に 4 バイトまたは 8 バイトになります。

C C 言語では、ビット・フィールドを、int ではなく char または short として指定することができますが、XL C/C++ はそれらを、unsigned int としてマップします。ビット・フィールドの長さは、その基本型の長さを超えることはできません。拡張モードでは、ビット・フィールドに対して sizeof 演算子を使用することができます。 (ビット・フィールドに作用する sizeof 演算子は、常に 4 を返します。)

C++ ビット・フィールドの長さは、その基本型の長さを超えてもかまいませんが、残りのビットはフィールドの埋め込みに使用され、値は実際には保管されません。

ただし、ビット・フィールドを含む集合体の位置合わせ規則は、指定する位置合わせ設定によって異なります。この規則については、以下で説明します。

Linux PowerPC 位置合わせの規則

ビット・パック位置合わせの規則

ビット・フィールド位置合わせの例

ビット・パックの例

下の例では、

#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

IBM Copyright 2003