Беззнаковый комплемент символа 1 в Си

Предположим, у меня есть следующий код:

unsigned char c = 0;
printf("%u\n", ~c);

GCC печатает значение 4294967295означает, что он печатает значение ULONG_MAX,

C11 6.3.1.3 Целые числа со знаком и без знака:

  1. Когда значение с целочисленным типом преобразуется в другой целочисленный тип, кроме _BoolЕсли значение может быть представлено новым типом, оно не изменяется.
  2. В противном случае, если новый тип является беззнаковым, значение преобразуется путем многократного сложения или вычитания на единицу больше максимального значения, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне нового типа.60)
  3. В противном случае новый тип подписывается, и значение не может быть представлено в нем; либо результат определяется реализацией, либо определяется сигнал реализации.

Так, c повышен до unsigned int перед применением оператора ~, Таким образом, результатом является дополнение 0u, Я прав? или это не определено?

1 ответ

C не выполняет арифметику в (без знака) char типы. Все аргументы продвигаются первыми, в соответствии с целочисленными акциями. unsigned char способствует intтак что результат ~x это -1. Затем вы печатаете это значение как неподписанное int, который дает результат, который вы наблюдали.

Другие вопросы по тегам