:1、:7、:16、:32など、構造体宣言のコロンは何を意味しますか?
-
05-07-2019 - |
質問
次のC ++コードの意味は何ですか?
unsigned char a : 1;
unsigned char b : 7;
2つの文字aとbが作成され、両方とも1バイトの長さにする必要がありますが、":1"および&quot ;: 7"一部が行います。
解決
1と7は、値の範囲を制限するビットサイズです。それらは通常、構造体と組合にあります。たとえば、一部のシステム( char
の幅やパッキング規則などに依存)では、コード:
typedef struct {
unsigned char a : 1;
unsigned char b : 7;
} tOneAndSevenBits;
8ビット値を作成します。 a
に1ビット、 b
に7ビットです。
「圧縮済み」にアクセスするためにCで通常使用されます。 8ビット文字の上半分に含まれる可能性がある4ビットニブルなどの値:
typedef struct {
unsigned char leftFour : 4;
unsigned char rightFour : 4;
} tTwoNybbles;
私たちの間の言語弁護士のために、C ++ 11標準の9.6セクションでこれを詳細に説明していますが、少し言い換えています:
ビットフィールド[class.bit]
フォームのメンバー宣言子
      identifier opt     attribute-specifier opt     :    constant-expression
はビットフィールドを指定します。その長さは、コロンによってビットフィールド名と区別されます。オプションの attribute-specifier は、宣言されるエンティティに関連付けられます。ビットフィールド属性は、クラスメンバーの型の一部ではありません。
constant-expression は、ゼロ以上の値を持つ整数定数式でなければなりません。整数定数式の値は、ビットフィールドの型のオブジェクト表現のビット数よりも大きい場合があります。そのような場合、余分なビットはパディングビットとして使用され、ビットフィールドの値表現には関与しません。
クラスオブジェクト内のビットフィールドの割り当ては実装定義です。ビットフィールドのアライメントは実装定義です。ビットフィールドは、アドレス可能な割り当てユニットにパックされます。
注:ビットフィールドは、一部のマシンでは割り当てユニットにまたがっており、他のマシンではありません。ビットフィールドは、一部のマシンでは右から左に割り当てられ、他のマシンでは左から右に割り当てられます。 -メモを終了
他のヒント
これらはビットフィールドになると思います。
厳密に言えば、ビットフィールドはint、unsigned int、または_Boolでなければなりません。ほとんどのコンパイラは整数型を取りますが。
Ref C11 6.7.2.1:
ビットフィールドには、修飾または非修飾の型が必要です _Bool、signed int、unsigned int、またはその他のバージョン 実装定義型。
お使いのコンパイラはおそらく1バイトのストレージを割り当てますが、それ以上を自由に取得できます。
Ref C11 6.7.2.1:
実装は、アドレス可能なストレージユニットを大きく割り当てることができます ビットフィールドを保持するのに十分です。
次々に宣言されている複数のビットフィールドがある場合、節約になります。この場合、割り当てられたストレージは、可能であればパックされます。
Ref C11 6.7.2.1:
十分なスペースが残っている場合、ビットフィールド 構造内の別のビットフィールドのすぐ後に続く 同じユニットの隣接するビットに。十分なスペースが残っていない場合、 適合しないビットフィールドが次のユニットに配置されるかどうか 隣接するユニットとのオーバーラップは実装定義です。