Пожалуйста, посмотрите мой тестовый код:
#include <stdlib.h>
#include <stdio.h>
#define PRINT_COMPARE_RESULT(a, b) \
if (a > b) { \
printf( #a " > " #b "\n"); \
} \
else if (a < b) { \
printf( #a " < " #b "\n"); \
} \
else { \
printf( #a " = " #b "\n" ); \
}
int main()
{
signed int a = -1;
unsigned int b = 2;
signed short c = -1;
unsigned short d = 2;
PRINT_COMPARE_RESULT(a,b);
PRINT_COMPARE_RESULT(c,d);
return 0;
}
Результат следующий:
a > b
c < d
Моя платформа - Linux, а моя версия gcc - 4.4.2. Я меня удивила вторая строка вывода. Первая строка вывода вызвана целочисленным продвижением. Но почему результат второй строки отличается?
Следующие правила взяты из стандарта C99:
Если оба операнда имеют один и тот же тип, дальнейшее преобразование не требуется. В противном случае, если оба операнда имеют целочисленные типы со знаком или оба имеют целочисленные типы без знака , операнд с типом меньшего целочисленного ранга преобразования преобразуется в тип операнда с большим рангом.
В противном случае, если операнд, имеющий целочисленный тип без знака, имеет ранг больше или равный рангу типа другого операнда, то операнд со знаком целочисленного типа преобразуется в тип операнда с беззнаковым целочисленным типом .
В противном случае, если тип операнда с целочисленным типом со знаком может представлять все значения типа операнда с целочисленным типом без знака, то операнд с целочисленным типом без знака будет преобразован в тип операнда со знаком целочисленного типа.
В противном случае оба операнда преобразуются в беззнаковый целочисленный тип , соответствующий типу операнда со знаком целочисленного типа.
Я думаю, что оба сравнения должны относиться к одному и тому же случаю - второму случаю целочисленного продвижения.