このセクションでは、C 言語のビットフィールドとは何かを理解します。
C プログラムに、次のように state と呼ばれる構造体にグループ化された多くの 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 ビットのみです。
最大 32 個の変数が使用され、各変数の幅が 1 ビットである場合、ステータス構造体も 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</p><p>", sizeof(status1)); printf( "Memory size occupied by status2 : %d</p><p>", sizeof(status2)); return 0; }
Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
ビットフィールド宣言は、構造内で次の形式になります -
struct { type [member_name] : width ; };
次の表では、ビットフィールドの変数要素について説明します-
要素 | 説明 th> |
---|---|
type | ビットフィールド値がどのように解釈されるかを決定する整数型。型は、int、signed int、または unsigned int のいずれかです。 |
member_name | ビット フィールドの名前。 |
幅 | ビットフィールドの桁数。幅は、指定された型のビット幅以下である必要があります。 |
struct { unsigned int age : 3; } Age;
#include <stdio.h> #include <string.h> struct { unsigned int age : 3; } Age; int main( ) { Age.age = 4; printf( "Sizeof( Age ) : %d</p><p>", sizeof(Age) ); printf( "Age.age : %d</p><p>", Age.age ); Age.age = 7; printf( "Age.age : %d</p><p>", Age.age ); Age.age = 8; printf( "Age.age : %d</p><p>", Age.age ); return 0; }
以上がC のビットフィールドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。