/*###9 [cc] 警告: CBC:e51: 0x80000000以上時正負不明の式。 明示キャスト要、演算子は"<"%%%*/ 一言で言うと、 if(unsigned CHAR型変数 < INT型変数)の unsigned CHAR型変数を、INT型変数に 変えれるならば、変えた方が、 処理速度が早くて 安全。
修正前: int main() { unsigned char Cval ; int Ival ; ~ if(Cval < Ival) { ~ } } int 修正後: main() { int Cval ; int Ival ; ~ if(Cval < Ival) { ~ } }
どうしても、CHARを使用したい人は以下の面倒くさい説明を読む。
int i=0x80000001 ;
unsigned char uc =0x7f ;備考 修正前 if(i < uc)
ANSI-Cはthen側に来る
K&R-Cはelse側に来るコンパイラによって動作が異なる 値保持
修正例if( i < uc)
then側に必ず来る
else側には来ないどちらのコンパイラを使用しても
同じ結果になります符号無し保持
修正例if(i < uc)
then側には来ない
else側に必ず来るどちらのコンパイラを使用しても
同じ結果になります
解説 ANSI-CとK&R-Cで型の拡張規則の仕様が変わりました。 詳細は、 『ANSIーC移行の手引き 第3章』 か、 『プログラミング言語C 第2版 ANSI規格準拠 カーニハン リッチー著/石田晴久訳』 「付録A6.5 算術変換」Page241 か、 C-FAQ 3.18J(本にあるがWEB無し) を参照して下さい。