Беззнаковый комплемент символа 1 в Си
Предположим, у меня есть следующий код:
unsigned char c = 0;
printf("%u\n", ~c);
GCC печатает значение 4294967295
означает, что он печатает значение ULONG_MAX
,
C11 6.3.1.3 Целые числа со знаком и без знака:
- Когда значение с целочисленным типом преобразуется в другой целочисленный тип, кроме
_Bool
Если значение может быть представлено новым типом, оно не изменяется.- В противном случае, если новый тип является беззнаковым, значение преобразуется путем многократного сложения или вычитания на единицу больше максимального значения, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне нового типа.60)
- В противном случае новый тип подписывается, и значение не может быть представлено в нем; либо результат определяется реализацией, либо определяется сигнал реализации.
Так, c
повышен до unsigned int
перед применением оператора ~
, Таким образом, результатом является дополнение 0u
, Я прав? или это не определено?
1 ответ
C не выполняет арифметику в (без знака) char
типы. Все аргументы продвигаются первыми, в соответствии с целочисленными акциями. unsigned char
способствует int
так что результат ~x
это -1. Затем вы печатаете это значение как неподписанное int
, который дает результат, который вы наблюдали.