7

プログラムは:

typedef struct xp {
        int a:2;
        int b:2;
        int c:1;
} xp;

int main(void)
{
        xp x;
        memset(&x, 0, sizeof(xp));

        x.a = 1;
        x.b = 3;
        x.c = 1;

        printf("%d\n",x.a);
        printf("%d\n",x.b);
        printf("%d\n",x.c);

        return 0;
}

私は1-1-1を取得します、なぜですか?a、b、cはxにどのように格納されますか?printf( "%d \ n"、xa);のときに何が起こったのか 実行されますか?

4

2 に答える 2

5

ビットフィールドに符号付き型を使用しています。つまり、2つの2ビット符号付き整数と1つの1ビット符号付き整数に相当するものを作成しました。

2ビットの符号付き整数(2の補数)に使用できる値は、-2、-1、0、および1です。

1ビットの符号付き整数(2の補数)に使用できる値は、-1と0です。

次の行で行ったように、「適合しない」値を格納することにより、次のようになります。

x.b = 3;
x.c = 1;

保存したビットパターンは、読み取ったときに解釈が異なるため、奇妙な動作が発生します。次のようなことを行うことで、同様の体験をすることができます。

char x = 58147;

8ビットcharタイプのマシンでは、その値は適合しないため、にアクセスすると別の内容が読み取られますx

于 2012-08-07T23:25:50.213 に答える
2

タイプのビットフィールドは、タイプまたはタイプのintいずれかです。選択は実装定義です。これは歴史的な理由によるものです。これは、とが異なる可能性がある唯一のコンテキストです。signed intunsigned intintsigned int

これは、C標準(C99ドラフトC11ドラフト)のセクション6.7.2で、型指定子のリストに従って指定されています。

intコンマで区切られた各マルチセットは同じタイプを指定しますが、ビットフィールドの場合、指定子がと同じタイプを指定するか、と同じタイプを指定するかは実装によって定義さsigned intunsigned intます。

int解決策は、ビットフィールドにプレーンを使用しないようにすることです。常にとしてsigned intまたはとして宣言してくださいunsigned int。(ほとんどの場合、後者の方が理にかなっています。)

于 2012-08-07T23:31:40.870 に答える