main() {
if ( -1 < (unsigned char) 1 )
printf("less than");
else
printf("NOT less than");
}
プリントしless than
ます。(unsigned char) 1
は、に変換されてから (signed char) 1
:に変換されるため、(signed) -1 < (signed) 1
出力は。になりますless than
。
しかし、上記のコードを次のように変更するとif ( (-1 < (unsigned int) 1 )
その場合、出力はNOT less than
です。
したがって、unsignedcharをunsignedintに変更すると、次のようになります。
- (signed)-1はunsignedintに変換されます[正反対のことが起こっています]
- -1は2の1の補数として格納されるため。ビットパターンは255と評価されます(おそらく)
- したがって、255 <1はfalseと評価され、それ以外の場合は実行されます。
int a = -1;
'-1'の代わりに置き換えても同じ結果
質問:
符号付きおよび符号なし演算中...符号付きが符号なしに変換されるか、またはその逆になるかを確認する方法。
unsigned charとcharの間で算術演算の変換が異なるのはなぜですか:明らかにunsignedはsignedとunsigned intに変換され、int:明らかにsignedはunsignedに変換されます
PS:これはコンパイラに依存しないことを私は知っています。だからそうは言わないでください。