не может понять, как работает ~ оператор в c - PullRequest
0 голосов
/ 11 февраля 2010

У меня есть этот кусок кода, вы можете объяснить мне вывод

unsigned int x=3;
~x;
printf("%d",x);

вывод 10 Я не могу сделать это как.

Я скомпилировал код на Turbo C

Ответы [ 2 ]

2 голосов
/ 11 февраля 2010

Код, который вы опубликовали, не будет компилироваться.Он будет скомпилирован, если вы измените ~x на x = ~x;, но тогда он не выдаст вывод "10".

Оператор ~ создает побитовую инверсию заданного числа.В двоичном формате число 3 в виде восьмибитного целого числа представлено битами 00000011.Оператор ~ заменит каждый из этих битов на противоположные, давая 11111100, что означает 252 без знака или -4 со знаком.

Вы объявили x как unsigned int, что означает32-разрядное значение без знака на большинстве платформ.Таким образом, ваше исходное значение равно 00000000 00000000 00000000 00000011, а обратное значение равно 11111111 11111111 11111111 11111100 или 4294967292.

2 голосов
/ 11 февраля 2010

Чтобы распечатать значения без знака, , особенно при работе с битами , используйте формат без знака для printf:

printf("%u", x);

Я не уверен, что вы на самом деле запускаете код, который вы показываете. Смотрите это:

#include <stdio.h>

int main()
{
    unsigned int x = 3;
    unsigned int y = ~x;

    printf("Decimal. x=%u y=%u\n", x, y);
    printf("Hex. 0x%08X y=0x%08X\n", x, y);
    return 0;
}

Выходы:

Decimal. x=3 y=4294967292
Hex. 0x00000003 y=0xFFFFFFFC

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

...