次のコードを検討してください。
uint16_t a = ~ ( uint16_t ) 0;
int16_t b = ~ ( int16_t ) 0;
printf (
"%d %d %d %d\n",
a == ~ ( uint16_t ) 0,
a == ( uint16_t ) ( ~ ( uint16_t ) 0 ),
b == ~ ( int16_t ) 0,
b == ( int16_t ) ( ~ ( int16_t ) 0 )
);
出力は次のとおりです。
0 1 1 1
GCC は次の警告をスローしますa == ~ ( uint16_t ) 0
。
データ型の範囲が制限されているため、比較は常に false [-Wtype-limits]
ビットごとの「not」演算子が符号付きの値を返そうとしているのはなぜですか? どうすればそれを防ぐことができますか?