私は小さなサンプル関数を持っています:
#define VALUE 0
int test(unsigned char x) {
if (x>=VALUE)
return 0;
else
return 1;
}
私のコンパイラは、比較(x> = VALUE)がすべての場合に真であると警告します。これは、xが符号なし文字であり、VALUEが値0で定義されているためです。そこで、コードを次のように変更しました。
if ( ((signed int) x ) >= ((signed int) VALUE ))
しかし、警告が再び来ます。3つのGCCバージョンでテストしました(すべてのバージョン> 4.0、場合によっては-Wextraを有効にする必要があります)。
変更されたケースでは、この明示的なキャストがあり、signedint比較である必要があります。比較が常に真実であると主張するのはなぜですか?