C - ビット フィールド
次のように、C プログラムに、status と呼ばれる構造体にグループ化された多数の TRUE/FALSE 変数が含まれているとします-
struct { unsigned int widthValidated; unsigned int heightValidated; } status;
この構造には 8 バイトのメモリ空間が必要ですが、実際には、各変数に 0 または 1 を格納します。 C プログラミング言語は、このような状況でメモリ空間を利用するための優れた方法を提供します。
構造体内でそのような変数を使用している場合は、変数の幅を定義して、それらのバイト数のみを使用することを C コンパイラに伝えることができます。たとえば、上記の構造は次のように書き直すことができます −
struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status;
上記の構造では、ステータス変数用に 4 バイトのメモリ空間が必要ですが、値を格納するために使用されるのは 2 ビットのみです。
それぞれ 1 ビット幅の最大 32 個の変数を使用する場合、ステータス構造体も 4 バイトを使用します。ただし、変数が 33 個になるとすぐに、メモリの次のスロットが割り当てられ、8 バイトの使用が開始されます。概念を理解するために次の例を確認してみましょう-
ライブデモ#include <stdio.h> #include <string.h> /* define simple structure */ struct { unsigned int widthValidated; unsigned int heightValidated; } status1; /* define a structure with bit fields */ struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status2; int main( ) { printf( "Memory size occupied by status1 : %d\n", sizeof(status1)); printf( "Memory size occupied by status2 : %d\n", sizeof(status2)); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
ビット フィールド宣言
ビットフィールドの宣言は、構造内に次の形式があります −
struct { type [member_name] : width ; };
次の表は、ビット フィールドの可変要素について説明しています −
Sr.No. | 要素と説明 |
---|---|
1 | タイプ ビットフィールドの値がどのように解釈されるかを決定する整数型。型は int、signed int、または unsigned int です。 |
2 | member_name ビットフィールドの名前。 |
3 | 幅 ビットフィールドのビット数。幅は、指定された型のビット幅以下でなければなりません。 |
定義済みの幅で定義された変数は、ビット フィールドと呼ばれます .ビット フィールドには複数のビットを保持できます。たとえば、0 から 7 までの値を格納する変数が必要な場合、次のように 3 ビット幅のビット フィールドを定義できます −
struct { unsigned int age : 3; } Age;
上記の構造体定義は、age 変数が 3 ビットのみを使用して値を格納することを C コンパイラに指示します。 3 ビットを超えて使用しようとすると、使用できなくなります。次の例を試してみましょう −
ライブデモ#include <stdio.h> #include <string.h> struct { unsigned int age : 3; } Age; int main( ) { Age.age = 4; printf( "Sizeof( Age ) : %d\n", sizeof(Age) ); printf( "Age.age : %d\n", Age.age ); Age.age = 7; printf( "Age.age : %d\n", Age.age ); Age.age = 8; printf( "Age.age : %d\n", Age.age ); return 0; }
上記のコードがコンパイルされると、警告付きでコンパイルされ、実行されると、次の結果が生成されます −
Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0
C言語