Почему unsigned int 1 ниже, чем char y -1? - PullRequest
8 голосов
/ 02 июля 2011
main() {
    unsigned x = 1;
    char y = -1;

    if (x > y)
        printf("x>y");
    else
        printf("x<=y");
}

Я ожидал x>y, но мне пришлось изменить unsigned int на signed int, чтобы получить ожидаемый результат.

Ответы [ 2 ]

15 голосов
/ 02 июля 2011

Если char эквивалентно signed char:

  • char повышается до int (целочисленные предложения, ISO C99 §6.3.1.1 ¶2)
  • Поскольку int и unsigned int имеют одинаковый ранг, int преобразуется в unsigned int (Арифметические преобразования, ISO C99 §6.3.1.8)

Если char эквивалентноunsigned char:

  • char может быть повышен до int или unsigned int:
    • Если int может представлять все значения unsigned char (обычно потому, что sizeof(int) > sizeof(char)), char преобразуется в int.
    • В противном случае (обычно потому, что sizeof(char)==sizeof(int)), char преобразуется в unsigned.
  • Теперь у нас есть один операнд int или unsigned int, а другой - unsigned int.Первый операнд преобразуется в unsigned int.

Целочисленные продвижения: выражение типа более низкого ранга, которое int преобразуется в int, если int может содержать все значенияоригинального типа, в unsigned int в противном случае.

Арифметические преобразования: Попробуйте преобразовать в больший тип.Когда существует конфликт между подписанным и беззнаковым, если более крупный (включая случай, когда два типа имеют одинаковый ранг) тип без знака, следует использовать без знака.В противном случае используйте подпись только в том случае, если она может представлять все значения обоих типов.

Преобразования в целочисленные типы (ISO C99 §6.3.1.3):

Преобразование out-of-диапазонное значение целочисленного типа без знака выполняется с помощью обхода (модульная арифметика).

Преобразование значения вне диапазона в целочисленный тип со знаком определяется реализацией и может вызвать сигнал (например,как SIGFPE).

3 голосов
/ 02 июля 2011

При использовании подписи и неподписания в одной операции подпись переводится в неподписанную с помощью автоматического преобразования типов в СиЕсли битовая комбинация -1 считается числом без знака, то это очень очень высокое значение.Так что x > y ложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...