次のC++コードは何を意味しますか? 「:1」と「:7」一部ん構造体宣言内のコロンは、1、:7、:16、または:32などの意味を持ちます。
unsigned char a : 1;
unsigned char b : 7;
は、私はそれが2つのchar a、bを作成し、それらの両方が1バイト長でなければなりませんが、私は何を考えていると思います。
次のC++コードは何を意味しますか? 「:1」と「:7」一部ん構造体宣言内のコロンは、1、:7、:16、または:32などの意味を持ちます。
unsigned char a : 1;
unsigned char b : 7;
は、私はそれが2つのchar a、bを作成し、それらの両方が1バイト長でなければなりませんが、私は何を考えていると思います。
1と7は、値の範囲を制限するビットサイズです。彼らは典型的には構造物や組合にあります。
typedef struct {
unsigned char a : 1;
unsigned char b : 7;
} tOneAndSevenBits;
は、8ビット値、b
ためa
と7ビットのための1つのビットを作成します。例えば、いくつかのシステムでは、コード(char
幅とパッキングルールなどに依存します)。 、米国間言語弁護士
typedef struct {
unsigned char leftFour : 4;
unsigned char rightFour : 4;
} tTwoNybbles;
:
は、典型的には、8ビットの文字の上半分に含まれるかもしれない4ビットニブルとして「圧縮」値にアクセスするためにCで使用しますC++ 11標準の9.6節では、これを詳細に説明し、わずかに言い換え:
ビットフィールド[class.bit]
OPT形
識別子 OPT 属性指定子のメンバ宣言: 定数式
はビットフィールドを指定します。その長さはコロンでビットフィールド名から設定されます。オプションの属性指定子は、宣言されているエンティティに属します。ビットフィールド属性は、クラスメンバの型の一部ではありません。
定数式は、0以上の値を持つ整数定数式でなければなりません。積分定数式の値は、ビットフィールド型のオブジェクト表現のビット数よりも大きい場合があります。このような場合、余分のビットはパディングビットとして使用され、ビットフィールドの値表現に関与しない。
クラスオブジェクト内のビットフィールドの割り当ては、実装定義です。ビットフィールドの整列は実装定義です。ビットフィールドは、いくつかのアドレス指定可能なアロケーションユニットにパックされる。
注:ビットフィールドは、一部のマシンではなく、他のマシンでも使用されます。ビットフィールドは、いくつかのマシンでは右から左に割り当てられ、他のマシンでは左から右に割り当てられます。 - 終了ノート
私はそれらがビットフィールドであると信じています。
なぜdownvote? –
わかりませんが、簡潔さや不確実性があるわけではありませんが、(1)あなたは技術的に正しいからです。 (2)周りの愛を共有する:-) – paxdiablo
厳密に言えば、ビットフィールドはint、unsigned int、または_Boolでなければなりません。ほとんどのコンパイラは整数型を使用しますが。
文献C11 6.7.2.1:
ビットフィールドは、_Boolの修飾または非修飾 バージョンであるタイプを有するものと、int型、unsigned int型、または他の何らかの 実装定義のタイプに署名しました。
コンパイラはおそらく1バイトの記憶域を割り当てますが、それ以上の空き容量はありません。
文献C11 6.7.2.1:
実装はbit-フィールドを保持するのに十分な 大きい任意のアドレス指定可能な記憶部を割り当てることができます。
複数のビットフィールドが次々に宣言されている場合に節約になります。この場合、割り当てられたストレージは可能な限りパックされます。
文献C11 6.7.2.1:
は直ちに構造に別のビットフィールドの後に続くことに十分なスペースが残って、ビットフィールドは、同一のユニットの隣接ビットに を充填しなければならない場合。十分なスペースが残っていない場合は、適合しないビットフィールドを次のユニットに入れるか、 が隣接するユニットにオーバーラップさせるかは実装定義されます。
厳密に言えば、純粋なCでは、 'unsigned char'では使用されません。 Cは、ビットフィールド宣言で 'int'、' signed int'と 'unsigned int'のみを許可します。 C99は '_Bool'を追加します。 'unsigned char'はC言語のビットフィールドにとって正当な型ではありません。 – AnT
少なくともc1xでは実装上の問題です:6.7.2.1 para4ビットフィールドの型は、修飾された\ _Bool、signed int 、unsigned int、または*その他の実装定義型*。 – paxdiablo
@paxdiablo:標準の特定のセクションで明示的に許可されていなくても、実装は常に適切な方法で言語を拡張することができるため、「その他の実装定義型」ビットは本当に冗長です。 Cの実装は、Cコード内でPascalとFortranのコードをコンパイルできます。誰もそのコードを実行することを禁止しています。しかし、Fortranコードを有効なCコードとして扱うのは奇妙なことです。同じことが「実装定義型」にも当てはまります。 – AnT