次のコード例を検討してください。
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標準に従って正しいですか、それとも追加する必要がある追加の仮定がありますか?