4

次のコード例を検討してください。

char c = 0xff;
char mask = 0xfe;
switch ((unsigned)(c & mask)) {
case -2: /* do task 1 */ break;
default:   /* do task 2 */
}

CHAR_BIT = 8 であり、c および mask への実装定義の割り当てがビット パターン 11111111 および 11111110 の解釈によるものであり、負のゼロが許可されていると仮定します。したがって、このコードの動作は次のようになります。

char が符号付きで、実装が 2 の補数を使用する場合、c = -1, mask = -2, c & mask = -2, (unsigned)(c & mask) = UINT_MAX - 1.

char が符号付きで、実装が 1 の補数を使用する場合、c = 0, mask = -1, c & mask = 0, (unsigned)(c & mask) = 0. cはゼロであり、負のゼロではありません。これは、C では代入による負のゼロの作成が許可されていないためです。

char が符号付きで、実装が符号付きマグニチュードを使用する場合、c = -127, mask = -126, c & mask = -126, (unsigned)(c & mask) = UINT_MAX - 125

char が unsigned の場合c = 255, mask = 254, c & mask = 254, (unsigned)(c & mask) = 254

ケース定数-2は制御式と同じ型に変換されるため、値はUINT_MAX - 1です。したがって、char が符号付きで、実装が 2 の補数を使用する場合にのみ一致します。

これはC標準に従って正しいですか、それとも追加する必要がある追加の仮定がありますか?

4

1 に答える 1

1

これはC標準に従って正しいですか

あまり。charが符号付きで 8 ビット (つまりCHAR_MAX255 未満) の場合、次の行

char c = 0xff;

実装定義です。あなたの言うとおりになるかもしれませんが、そうではないかもしれません。

C 標準 6.3.1.3:

それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。

于 2011-11-09T09:39:37.017 に答える