Значение% x и ~ - PullRequest
       25

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

9 голосов
/ 17 января 2012
int m=32
printf("%x" , ~m);

Выход этого оператора равен ffdf, а без ~ вывод равен 20.Какое значение имеют %x и ~?

Ответы [ 6 ]

21 голосов
/ 17 января 2012

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

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

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

0000 0000 0010 0000

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

1111 1111 1101 1111

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

1111 1111 = 0xff

И

1101 1111 = 0xdf
6 голосов
/ 17 января 2012

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

~ это поразрядно НЕ , который переворачивает все биты в целом числе.

Утверждение:

printf("%x", m);

отобразит вывод 20 как 0x20 = десятичное число 32.

Утверждение:

printf("%x", ~m);

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

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

Base 10:         32                  65503
Base 16:        0x20                0xFFDF
Base 2:    0000000000100000    1111111111011111
2 голосов
/ 18 января 2012

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

32 - это 00100000 в двоичном формате, а ~ 32 - это 11011111 в двоичном (или 223 в десятичном виде).Параметр 1012 * в функции 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

1 голос
/ 18 января 2012

Это означает, что 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.)

1 голос
/ 17 января 2012

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

1 голос
/ 17 января 2012

И% x означает, что вы печатаете значение x в шестнадцатеричном формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...