main() {
unsigned x = 1;
char y = -1;
if (x > y)
printf("x>y");
else
printf("x<=y");
}
Я ожидал x>y
, но мне пришлось изменить unsigned int
на signed int
, чтобы получить ожидаемый результат.
main() {
unsigned x = 1;
char y = -1;
if (x > y)
printf("x>y");
else
printf("x<=y");
}
Я ожидал x>y
, но мне пришлось изменить unsigned int
на signed int
, чтобы получить ожидаемый результат.
Если char
эквивалентно signed char
:
char
повышается до int
(Integer Promotions, ISO C99 §6.3.1.1 ¶2)int
и unsigned int
имеют одинаковый ранг, int
преобразуется в unsigned int
(Арифметические преобразования, ISO C99 §6.3.1.8)Если char
эквивалентно unsigned char
:
char
may be promoted to either int
or unsigned int
:
int
can represent all unsigned char
values (typically because sizeof(int) > sizeof(char)
), char
is converted to int
.sizeof(char)==sizeof(int)
) char
преобразуется в unsigned
.int
или unsigned int
, а другой — unsigned int
. Первый операнд преобразуется в unsigned int
.Целочисленные повышения: выражение типа более низкого ранга, который int
преобразуется в int
, если int
может содержать все значения исходного типа, в unsigned int
в противном случае.
Арифметические преобразования: попробуйте преобразовать в более крупный шрифт. Когда возникает конфликт между подписанным и беззнаковым, если более крупный (включая случай, когда два типа имеют одинаковый ранг) тип беззнаковый, используйте беззнаковый. В противном случае используйте signed только в том случае, если он может представлять все значения обоих типов.
Преобразование в целые типы (ISO C99 §6.3.1.3):
Преобразование значения вне диапазона в беззнаковый целочисленный тип выполняется с помощью циклического переноса (модульной арифметики).
Преобразование значения вне диапазона в целочисленный тип со знаком определяется реализацией и может вызывать сигнал (например, SIGFPE).
При использовании подписанного и неподписанного в одной операции подписанный был повышен до беззнакового автоматическим преобразованием типа C. Если битовый шаблон -1
считается беззнаковым числом, то это очень большое значение. Итак, x > y
ложно.
char
до unsigned
зависит от базового представления char
в реализации (например, дополнения до двух), что неверно. .
- person CB Bailey; 02.07.2011
'-1'
выдает предупреждение, потому что на самом деле это'-'
и'1'
вместе, а не число -1. Последнее игнорируется. - person Lekensteyn   schedule 02.07.2011