57

次の C++ コードはどういう意味ですか?

unsigned char a : 1; 
unsigned char b : 7;

2 つの char a と b が作成されると思いますが、どちらも 1 バイトの長さである必要がありますが、「: 1」と「: 7」の部分が何をするのかわかりません。

4

3 に答える 3

67

1 と 7 は、値の範囲を制限するためのビット サイズです。それらは通常、構造体と共用体で見られます。たとえば、一部のシステム (char幅やパッキング ルールなどによって異なります) では、コードは次のようになります。

typedef struct {
    unsigned char a : 1;
    unsigned char b : 7;
} tOneAndSevenBits;

aの場合は 1 ビット、 の場合は 7 ビットの 8 ビット値を作成しますb

通常、8 ビット文字の上半分に含まれる可能性のある 4 ビット ニブルなどの「圧縮された」値にアクセスするために C で使用されます。

typedef struct {
    unsigned char leftFour  : 4;
    unsigned char rightFour : 4;
} tTwoNybbles;

私たちの中の言語弁護士のために、C++11 標準の 9.6 セクションで、これを少し言い換えて詳細に説明しています。


ビットフィールド [class.bit]

フォームのメンバー宣言子

     識別子opt   属性指定子opt    :   定数式

ビットフィールドを指定します。その長さは、ビットフィールド名からコロンで区切られています。オプションのattribute-specifierは、宣言されているエンティティに関係します。ビット フィールド属性は、クラス メンバーの型の一部ではありません。

定数式は、ゼロ以上の値を持つ整数定数式でなければなりません。整数定数式の値は、ビットフィールドの型のオブジェクト表現のビット数よりも大きい場合があります。このような場合、余分なビットはパディング ビットとして使用され、ビット フィールドの値表現には関与しません。

クラス オブジェクト内のビット フィールドの割り当ては実装定義です。ビットフィールドのアライメントは実装定義です。ビットフィールドは、アドレス指定可能なアロケーション ユニットにパックされます。

注:ビットフィールドは、一部のマシンではアロケーション ユニットにまたがっていますが、他のマシンではそうではありません。ビットフィールドは、一部のマシンでは右から左に割り当てられ、他のマシンでは左から右に割り当てられます。-エンドノート

于 2009-10-22T04:09:11.047 に答える
9

それらはビットフィールドになると思います。

于 2009-10-22T04:09:51.967 に答える