Это означает, что x
должно было быть объявлено unsigned
, а не int
.
Формат "%x"
printf требует аргумента unsigned int
и печатает его значение в шестнадцатеричном формате (основание 16). Вы можете безопасно использовать его с аргументом int
, если значение находится в пределах диапазона, представляемого либо как int
, либо как unsigned int
(т.е. 0 .. INT_MAX
). Использование "%x"
с отрицательным значением int
, как делает этот фрагмент кода, строго говоря, имеет неопределенное поведение, хотя реальное поведение, вероятно, будет достаточно последовательным.
Стандарт C гласит:
Результат оператора ~ является побитовым дополнением его
(повышенный) операнд (то есть каждый бит в результате устанавливается, если и только
если соответствующий бит в преобразованном операнде не установлен).
Обратите внимание, что оно определяется в терминах представления операнда, а не его значения.
Вывод, который вы описываете, указывает на то, что вы используете систему с целыми числами со знаком с двумя дополнительными знаками, где int
составляет всего 16 бит, что необычно в наши дни. (Вы используете древний компилятор Turbo C или что-то подобное?) В моей системе эта программа:
#include <stdio.h>
int main(void) {
int m = 32;
printf("%x\n" , ~m);
return 0;
}
производит этот вывод:
ffffffdf
(Обратите внимание, что я добавил обязательные #include <stdio.h>
и точку с запятой в объявлении m
.)