2015-08-02 7 views
3

Я пытаюсь выяснить, почему следующий код:Как компилятор рассматривает печать unsigned int как подписанный int?

{ 
    unsigned int a = 10; 
    a = ~a; 
    printf("%d\n", a); 
} 

a будет 00001010 для начала, и после того, как НЕ opertaion, превратит

в 11110101.

Что происходит именно тогда, когда один пытается напечатать a, как знаковое целое, что делает

напечатанный результат будет -11?

Я думал, что в конечном итоге вижу -5 возможно (согласно двоичному представлению), но не -11.

Буду рад получить разъяснения по этому вопросу.

ответ

6

Обозначение дополнений 2 используется для хранения отрицательных чисел.

Номер 10 0000 0000 0000 0000 0000 0000 0000 1010 в 4-байтовом двоичном формате.

а = ~ а делает содержание 1111 1111 1111 1111 1111 1111 1111 0101.

Это число, когда рассматривается как подписанный ИНТ сообщит компилятору принять значащий бит как знак и отдых в величина.

1 в msb делает число отрицательным числом.

Следовательно, операция дополнения 2 выполняется на оставшихся битах.

Таким образом, 111 1111 1111 1111 1111 1111 1111 0101 становится 000 0000 0000 0000 0000 0000 0000 1011.

Это когда интерпретируется как десятичное целое число становится -11.

+0

Благодарим вас за подробный и ясный ответ :) – Adiel

+1

Комментарий педантизма: C не требует дополнения 2s. Он даже не указывает, как сохраняются числа. x86 и ARM, однако, используйте дополнение 2s –

2

Когда вы пишете a = ~a; сторнирование каждый в каждый бите в, что также называется дополнением к 1.

представления отрицательного числа объявлено зависит от реализации, а это означает, что различные архитектуры могут иметь другое представление для -10 или -11.

Предполагая 32 архитектуры на общем процессоре, который использует дополнения до 2, чтобы представлять отрицательные числа -1 будут представлены в виде FFFFFFFF (шестнадцатиричной) или 32 бит в 1.

~a будет представлен в виде = FFFFFFF5 или в двоичный код 1...10101, который является представлением -11.

Nota: первая часть всегда одинакова и не зависит от конкретной реализации, ~aявляетсяFFFFFFF5 на любой архитектуре 32 бит. Это только вторая часть (-11 == FFFFFFF5), которая зависит от реализации. BTW было бы -10 в архитектуре, которая будет использовать дополнение к 1 для представления отрицательных чисел.