原作: int i = 50 ; unsigned int ui = 8 ; if ( (ui - i) < 0 ) { /* (ui - i) は unsigned int 型になるため、 */ /* ここは絶対に実行されません */ never_do_something() ; }
修正例: /* 型を揃えるのが一番です */ int i = 50 ; int i2 = 8 ; if ( i2 < i ) { do_something() ; }
解説: 符号無しの値と定数の比較(1)と同種の問題であり、 unsigned な型となる (ui - i) は、絶対に 0 より小さい値にはなりません。 型が違う変数同士を被演算数とする場合には気を付けてください。 参考: 『プログラミング言語C 第2版 カーニハン リッチー著/石田晴久訳』 pp241-2 「A6.5 算術変換」を参照してください。