Если 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).