在该网站上有许多问题揭示了混合使用有符号和无符号类型时的陷阱,大多数编译器似乎能够很好地生成此类警告。 然而,GCC在将有符号常量分配给无符号类型时似乎并不关心!考虑以下程序:
/* foo.c */
#include <stdio.h>
int main(void)
{
unsigned int x=20, y=-30;
if (x > y) {
printf("%d > %d\n", x, y);
} else {
printf("%d <= %d\n", x, y);
}
return 0;
}
使用GCC 4.2.1编译以下代码,在控制台上没有输出:
gcc -Werror -Wall -Wextra -pedantic foo.c -o foo
生成的可执行文件会产生以下输出:
$ ./foo
20 <= -30
为什么 GCC 将有符号值 -30
分配给无符号整数变量 y
时,不会生成任何警告或错误消息?
printf("%d")
显示的是有符号值,而不是比较运算符使用的无符号值(4294967266)! - maerics