![C のビットフィールド](https://img.php.cn/upload/article/000/887/227/169418502893635.jpg)
このセクションでは、C 言語のビットフィールドとは何かを理解します。
C プログラムに、次のように state と呼ばれる構造体にグループ化された多くの TRUE/FALSE 変数が含まれているとします。 -
1 2 3 4 | struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status;
|
ログイン後にコピー
この構造体には 8 ビットのメモリ空間が必要ですが、実際には 0 または各変数に 1。この場合、C プログラミング言語を使用すると、メモリ空間をより効率的に利用できます。
このような変数を構造体で使用する場合は、変数の幅を定義して、これらのビット数のみを使用していることを C コンパイラに伝えることができます。たとえば、上記の構造は次のように書き換えることができます。 -
1 2 3 4 | struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;
|
ログイン後にコピー
上記の構造は、4 ビットの状態変数用のメモリ スペースを必要としますが、値の格納に使用するのは 2 ビットのみです。
最大 32 個の変数が使用され、各変数の幅が 1 ビットである場合、ステータス構造体も 4 ビットを使用します。ただし、変数が 33 個になると、メモリの次のスロットが割り当てられ、8 ビットの使用が開始されます。この概念を理解するために、次の例を確認してみましょう -
サンプル コード
ライブ デモンストレーション
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # include <stdio.h>
# include <string.h>
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status1;
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;
}
|
ログイン後にコピー
出力
1 2 | Memory size occupied by status1 : 8
Memory size occupied by status2 : 4
|
ログイン後にコピー
ビットフィールド宣言:
ビットフィールド宣言は、構造内で次の形式になります -
1 2 3 | struct {
type [member_name] : width ;
};
|
ログイン後にコピー
次の表では、ビットフィールドの変数要素について説明します-
要素 | 説明 |
---|
type | ビットフィールド値がどのように解釈されるかを決定する整数型。型は、int、signed int、または unsigned int のいずれかです。 |
member_name | ビット フィールドの名前。 |
幅 | ビットフィールドの桁数。幅は、指定された型のビット幅以下である必要があります。 |
#事前定義された幅で定義された変数はビット フィールドと呼ばれます。ビットフィールドは複数のビットを保持できます。たとえば、0 から 7 までの値を格納する変数が必要な場合は、以下に示すように 3 ビット幅のビットフィールドを定義できます。構造体定義は、age 変数が値を格納するために 3 ビットのみを使用するように C コンパイラーに指示します。 3 ビットを超えるビットを使用しようとすると、それは許可されません。次の例を試してみましょう。
サンプル コード
ライブ デモンストレーション
1 2 3 | struct {
unsigned int age : 3;
} Age;
|
ログイン後にコピー
出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 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 サイトの他の関連記事を参照してください。