Несколько вопросов на этом сайте показывают подводные камни при смешивании типов со знаком и без знака, и большинство компиляторов, похоже, хорошо справляются с генерацией предупреждений этого типа. Тем не менее, 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
?