2

ビットフィールドの仕組みについてもう少し理解しようとしています。

次のコードが与えられた場合: int が 32 ビットであると仮定します。

#include <stdio.h>

int main()
{
    struct byte
    {
        int one:1;
    };
    struct byte var = {3};
    printf("%d\n", var.one);
    printf("%#x\n", var);
    return 0;
}

私が得る出力は次のとおりです。

-1
0x1

しかし、私は次のことを期待していました:

-1
0x3

以来

struct byte var = {3};

int の 4 バイトに値 3 を代入していますね。

私が実際に得た出力から、上記のコード行が値 3 を 1 ビット フィールドに格納しようとしているように見えるため0x1、2 番目の出力行として出力されます。

だから私の質問は次のようになります:

構造全体に対するこれらの初期化と割り当てはどのように機能しますか?

また、なぜ{}必要なのですか?

4

1 に答える 1

4
int one:1;

これにより、ビットに使用されるビットが 1 つだけの int を宣言しsignます。なるほど-1

3 (011) を格納する場合は、合計で 2 (データ) +1 (符号) ビットが必要です。したがって、次のようになります。

struct byte
{
int one:3;
};

または unsigned int を使用します。

struct byte
{
unsigned int one:2;
};
于 2012-10-04T17:54:10.907 に答える