2

Code :: Blocks GCCでコンパイルされる次のコードを作成すると、次のようになります。

struct ByteSize
{
   unsigned char Test:64;
};

ByteSize構造体のサイズは8です。これは理にかなっています。しかし、ByteSizeのテストにアクセスしているとき、それはまだunsigned charまたは他の変数として扱われますか?これは危険ですか?私は本当にこれをするべきですか?コンパイラは8バイトの変数を1バイトの文字に変換しますか?

4

3 に答える 3

1

宣言

struct ByteSize
{
   unsigned char Test:64;
}

間違っている。ビットフィールドは、裸の符号なし型のみを使用する必要があります。

struct ByteSize
{
   unsigned Test:64;
}

値は符号なしであるため、符号ビットについて混乱することはありません。フィールドは、選択したフィールドサイズの符号なし整数として扱われます。

于 2012-10-29T04:14:32.303 に答える
1

Clang は次の警告を表示します。

warning: size of bit-field 'Test' (64 bits) exceeds the size of its type;
         value will be truncated to 8 bits

また、255 より大きい値を格納しようとすると、次の警告が表示されます。

warning: implicit conversion from 'int' to 'unsigned char' changes 
         value from 256 to 0

次に、それから読み取ろうとすると0が生成さsizeof(ByteSize) == 8れます。そのため、unsigned charとしてアクセスしているように見えますが、実際にはメンバーに1バイト以上格納できるのは好きではありません。

于 2012-10-29T01:17:57.617 に答える
1

標準を調べてみると、§9.6 で次のことがわかりました。

定数式は、ビットフィールドの型のオブジェクト表現 (3.9) のビット数よりも大きい場合があります。そのような場合、余分なビットはパディング ビットとして使用され、ビット フィールドの値表現 (3.9) には関与しません。

Testはビットフィールドであり、unsigned char やその他の型ではありません。unsigned char が 64 ビット以上を保持できると想定しているため、これは危険です。あなたは本当にこれをやるべきではありません。すべての変換規則を覚えているわけではありませんが、明示的に指示しない限り (たとえばキャストを使用して)、コンパイラは 8 バイトの非 char を char に変換するべきではありません。

...

お探しuint64_tですか?

于 2012-10-29T03:45:44.033 に答える