ホームページ > バックエンド開発 > C++ > C のビットフィールド

C のビットフィールド

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2023-09-08 22:57:03
転載
1484 人が閲覧しました

C のビットフィールド

このセクションでは、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>

/* 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;

}

ログイン後にコピー

出力

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート