下面的代码中,为什么GCC只会对情况1和3发出警告而不是情况2?
我正在使用-Wall和-g标志进行编译。
我正在使用-Wall和-g标志进行编译。
int main() {
unsigned int ui = 4;
int si = 6;
if (si == ui ) { // Warning comparison b/w signed and unsigned
printf("xxxx");
}
if (si == 2U ) { // No Warning --- WHY ???
printf("xxxx");
}
if (si > 2U ) { // Warning comparison b/w signed and unsigned
printf("xxxx");
}
return 0;
}
2U
是一个字面量,虽然si
是有符号的,但gcc在编译时清楚地知道可以将si
与2U
的值进行比较而不会失去精度:如果si
本身是负数,则在提升为无符号数后它不等于2U
。但对于大于2^31-1的字面量值,gcc会发出警告,因为如果si
为负数,则可能等于该字面量,这可能不是您期望的结果。而-Wall
不会发出任何警告,正如我回答中的链接所示。 - Ryan Li