Значение% x и ~

int m=32 printf("%x" , ~m); 

Результатом этого утверждения является ffdf и без ~ выхода – 20 . Каково значение %x и ~ ?

Оператор ~ – побитовое отрицание. Он будет печатать побитовое отрицание значения m . %x означает, что printf выведет свое значение в шестнадцатеричном формате.

Таким образом, значение 0xffdf является отрицанием значения 0x20 (32).

Значение 32 (биты int будут):

 0000 0000 0010 0000 

Его побитовое отрицание будет:

 1111 1111 1101 1111 

Это имеет смысл, поскольку:

 1111 1111 = 0xff 

А также:

 1101 1111 = 0xdf 

%x – формат printf , который указывает, что значение int должно отображаться в шестнадцатеричном формате.

~ Побитовое NOT , которое переворачивает все биты целого числа.

Заявление:

 printf("%x", m); 

будет отображать выход 20 как 0x20 = десятичный 32 .

Заявление:

 printf("%x", ~m); 

будет отображать вывод ffdf как 0xffdf является побитовым обратным 0x20 .

Возможно, имеет смысл визуализировать побитовое отрицание в двоичном формате:

 Base 10: 32 65503 Base 16: 0x20 0xFFDF Base 2: 0000000000100000 1111111111011111 

Символ ~ представляет побитовый NOT или оператор дополнения ; унарная операция, которая выполняет логическое отрицание для каждого бита , формируя их дополнение к данному двоичному значению. Двоичные цифры, равные 0, равны 1, а единицы, равные 1, равны 0.

32 – 00100000 в двоичном формате, а ~ 32 – 11011111 в двоичном формате (или 223 в десятичной системе).

Опция %x в printf отображает шестизначный формат без знака (с использованием строчных букв).

Так,

 printf("%x", m); // displays the hexadecimal value of 32 (00100000), "20" printf("%x", ~m); // displays the hexadecimal value of ~32 (11101111), "ffdf" 

[Источники]
http://en.wikipedia.org/wiki/Bitwise_operation#NOT
http://en.wikipedia.org/wiki/Hexadecimal
http://en.wikipedia.org/wiki/Printf_format_string

И% x означает, что вы печатаете значение x в hexadecimale.

~ 32 = -33 использовать unsigned int для получения результатов

Это означает, что x должен быть, вероятно, объявлен как unsigned а не int .

Формат "%x" printf требует аргумента unsigned int и выводит его значение в шестнадцатеричном формате (базовый 16). Вы можете безопасно использовать его с аргументом int если значение находится в пределах диапазона, представляемого либо как int либо как unsigned int (т. INT_MAX 0 .. INT_MAX ). Использование "%x" с отрицательным значением int , как это делает этот fragment кода, строго говоря, имеет неопределенное поведение, хотя фактическое поведение, вероятно, будет достаточно последовательным.

В стандарте C говорится:

Результатом оператора ~ является поразрядное дополнение его (продвинутого) операнда (то есть каждый бит в результате устанавливается тогда и только тогда, когда соответствующий бит в преобразованном операнде не задан).

Обратите внимание, что он определяется с точки зрения представления операнда, а не его значения.

Вывод, который вы описываете, указывает на то, что вы используете систему с целыми числами с двумя знаками дополнения, где int – всего 16 бит, что необычно в наши дни. (Вы используете древний компилятор Turbo C или что-то подобное?) В моей системе эта программа:

 #include  int main(void) { int m = 32; printf("%x\n" , ~m); return 0; } 

производит этот вывод:

 ffffffdf 

(Обратите внимание, что я добавил нужный #include и точку с запятой в объявлении m .)