Не шестнадцатеричное значение 0xffff? - PullRequest
3 голосов
/ 04 ноября 2011

Я полагаю, что вывод должен быть "0000", но это ffff как Не из ~ ffff-> 0000 0000 0000 0000

#include<stdio.h>
int main()
{
    unsigned int a=0xffff;
    ~a;
    printf("%x\n", a);
    return 0;
}

Ответы [ 6 ]

15 голосов
/ 04 ноября 2011

Необходимо присвоить значение обратно a:

a = ~a;

Даже в этом случае полученное значение может выглядеть следующим образом из-за размера типа данных:

ffff0000

Чтобы все заработало как положено (все 0), установите начальное значение a на UINT_MAX (от limits.h).При этом все биты устанавливаются в 1.

7 голосов
/ 04 ноября 2011

Запись ~a; не имеет никакого эффекта. Это выражение, которое возвращает дополнение a, но не меняет само a.

Вы хотите a = ~a;.

5 голосов
/ 04 ноября 2011

Как сказали Тим и Влад, вы ничего не делаете с побитовой инверсией.

Даже если вы измените код на a = ~a;, вы можете не получить ноль. Это потому, что если unsigned int имеет более 16 битов, вы будете иметь начальные нули, которые станут 1 после инверсии.

Так что я ожидаю, что ваш вывод будет

FFFF0000

или даже

FFFFFFFFFFFF0000

Если вам нужны 16-битные побитовые операции, вы можете использовать

#include <inttypes.h>
uint16_t a;
3 голосов
/ 04 ноября 2011

Поскольку вы не присвоили значение a.Вам нужно = ~ a;

1 голос
/ 04 ноября 2011

Как уже говорили другие, вам нужно либо присвоить значение обратно с помощью a = ~a; или распечатать результат напрямую с помощью printf("%x\n",~a);, но в любом случае вы все равно не получите ноль, как вы ожидаете.

Оператор ~ перевернет все биты в переменной.Поскольку вы, скорее всего, имеете дело с 32-разрядными целыми числами, в итоге вы получите 0xFFFF0000, потому что эти старшие 16 бит будут переключаться с нуля на единицу.

1 голос
/ 04 ноября 2011

~a сам по себе является оператором, который возвращает побитовое дополнение a. Вы можете либо присвоить ~a (как подсказывает @timcooper), либо вы можете

printf("%xn", ~a);
...