Раздел 6.3.1.8
, Обычные арифметические преобразования, из C99 детализирует неявные целочисленные преобразования.
Если оба операнда имеют одинаковый тип, дальнейшее преобразование не требуется.
Это не считается, так как они разных типов.
В противном случае, если оба операнда имеют целочисленные типы со знаком или оба имеют целочисленные типы без знака, операнд с типом ранга преобразования с меньшим целым числом преобразуется в тип операнда с большим рангом.
Это не считается, так как один подписан, а другой без знака.
В противном случае, если операнд с целым типом без знака имеет ранг, больший или равный рангу типа другого операнда, то операнд с целым типом со знаком преобразуется в тип операнда с целым типом без знака.
Бинго. x
имеет более высокий ранг, чем y
, поэтому y повышен до unsigned int
. Это означает, что он трансформируется из -1
в UINT_MAX
, значительно больше 9.
Остальные правила не применяются, так как мы нашли наш матч, но я добавлю их для полноты:
В противном случае, если тип операнда с целым типом со знаком может представлять все значения типа операнда с целым типом без знака, то операнд с целым типом без знака преобразуется в тип операнда с целым числом со знаком типа.
В противном случае оба операнда преобразуются в целочисленный тип без знака, соответствующий типу операнда с целочисленным типом со знаком.
Ранги, относящиеся к этому вопросу, приведены ниже. Все ранги подробно описаны в C99, раздел 6.3.1.1
, Boolean, символ и целые числа , так что вы можете обратиться к этому для получения дополнительной информации.
звание long long int
должно быть больше звания long int
, что
должно быть больше, чем ранг int
, который должен быть больше, чем ранг short int
, который должен быть больше, чем ранг signed char
.
Ранг char
равняется рангу signed char
и unsigned char
.