1

私が持っているとしましょう

struct A
{
    signed char a:1;
    unsigned char b:1;
};

私が持っている場合

A two, three;
two.a = 2; two.b = 2;
three.a = 3; three.b = 3;

two0フィールドには が含まれますが、 にthreeは が含まれます1。したがって、これは、シングルビットフィールドに数値を割り当てると、最下位ビットが取得されると思います(バイナリであり、2です)。10311

それで、私の質問は - これは正しいクロスプラットフォームですか? または、マシン、コンパイラなどに依存します。標準はこれについて何かを述べていますか、それとも完全に実装定義されていますか?

注: それぞれ と の代わりに と を代入しても、同じ結果が得られる場合01あり2ます3。私は質問を説明するためだけに使用23ましたが、実際の状況では使用しません

PSそして、はい、私は両方に興味があります-CそしてC++、私はこれを知っているので、それらが異なる言語であると私に言わないでください:)

4

1 に答える 1

4

この場合のルールは、全角演算の場合と同じです。ビットフィールドは、ビットフィールド宣言で指定した値によって幅が制限されることを除いて、対応するフルサイズ型と同じように動作します (C99 では 6.7.2.1/9)。

オーバーフロー値を符号付きビット フィールドに代入すると、実装定義の動作が発生します。つまり、ビット フィールドで観察される動作aは一般に移植性がありません。

オーバーフロー値を符号なしビット フィールドに代入すると、モジュロ算術の規則が使用されます。つまり、値は を法として取得されます。2^NここNで、 はビット フィールドの幅です。これは、たとえば、ビットフィールドに偶数を割り当てると常に value が生成され、そのようなビットフィールドに奇数を割り当てるbと常に value が生成されることを意味します。01

于 2012-10-04T14:13:16.553 に答える