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
.)