为什么GCC仅警告下面的代码中的情况1和3而不是2?
我正在使用-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;
}
答案 0 :(得分:4)
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html:
-Wconversion部分:
请勿警告明确的演员表
abs ((int) x)
和ui = (unsigned) -1
,或者abs (2.0)
中的转化未更改值。
由于2U
是文字,因此gcc知道:
si < 0
,则(unsigned) si >= 2^31
,s1 != 2U
。si > 0
,那么(unsigned) si
的值与si
相同,因此(unsigned) si == 2U
当且仅当si == 2
。总之,将已签名的si
与文字2U
进行比较与将si
与2
进行比较相同,即si == 2U
的结果不会通过将si
转换为unsigned
来更改。
如果与2 ^ 32-1(4294967295U)进行比较,32位无符号整数中的最大值(int
中无法表示),那么si
即使si
也等于{ {1}}本身是否定的,这可能不是您想要的,因此会使用-Wextra
选项生成警告。
答案 1 :(得分:1)
可能是因为在该类型的有符号和无符号版本重叠的范围内,与常量的相等比较没有歧义。
如果我将其更改为
if (si == 2147483648U ) {
printf("xxxx");
}
我收到警告
(实际上,在我收到您报告的警告之前,我必须添加-Wextra)
答案 2 :(得分:0)