e452.c

符号無しの値と定数の比較(1)


原作: int i = 50 ; unsigned int ui = 8 ; if ( (ui - i) >= 0 ) { /* (ui - i) は unsigned int 型になるため、 */ /* ここが必ず実行されます */ always_do_something() ; }
修正例: /* 型を揃えるのが一番です */ int i = 50 ; int i2 = 8 ; if ( i2 >= i ) { do_something() ; }
解説: unsigned int と int を被演算数とした計算結果は unsigned int となるため、 原作のソースは、(ui - i) が常に 0 以上となってしまいます。 参考: 『プログラミング言語C 第2版 カーニハン リッチー著/石田晴久訳』 pp241-2 「A6.5 算術変換」を参照してください。