e51.c

0x80000000以上正負不明式
/*###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 < (int)uc)
then側に必ず来る
else側には来ない
どちらのコンパイラを使用しても
同じ結果になります
符号無し保持
修正例
if(i < (unsigned)uc)
then側には来ない
else側に必ず来る
どちらのコンパイラを使用しても
同じ結果になります

解説 ANSI-CとK&R-Cで型の拡張規則の仕様が変わりました。 詳細は、 『ANSIーC移行の手引き 第3章』 か、 プログラミング言語C 第2版 ANSI規格準拠 カーニハン リッチー著/石田晴久訳』 「付録A6.5 算術変換」Page241 か、 C-FAQ 3.18J(本にあるがWEB無し) を参照して下さい。