В чем разница между unsigned int и sign int в C? - PullRequest
31 голосов
/ 28 сентября 2010

Рассмотрим эти определения:

int x=5;
int y=-5;
unsigned int z=5;

Как они хранятся в памяти? Кто-нибудь может объяснить битовое представление их в памяти?

Могут ли int x=5 и int y=-5 иметь одинаковое битовое представление в памяти?

Ответы [ 5 ]

43 голосов
/ 28 сентября 2010

ISO C устанавливает различия.

Тип данных int подписан и имеет минимальный диапазон от -32767 до 32767 включительно. Фактические значения указаны в limits.h как INT_MIN и INT_MAX соответственно.

unsigned int имеет минимальный диапазон от 0 до 65535 включительно с фактическим максимальным значением UINT_MAX из того же заголовочного файла.

Кроме того, стандарт не требует двух дополнительных обозначений для кодирования значений, это лишь одна из возможностей. Три допустимых типа будут иметь следующие кодировки для 5 и -5 (с использованием 16-битных типов данных):

        two's complement  |  ones' complement   |   sign/magnitude
    +---------------------+---------------------+---------------------+
 5  | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 |
-5  | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 |
    +---------------------+---------------------+---------------------+
  • В дополнении к двум вы получаете отрицательное число, инвертируя все биты, затем добавляя 1.
  • В дополнение к ним вы получаете отрицательное число, инвертируя все биты.
  • По знаку / величине старший бит - это знак, так что вы просто инвертируете его, чтобы получить отрицательное значение.

Обратите внимание, что положительные значения имеют одинаковую кодировку для всех представлений, отличаются только отрицательные значения.

Обратите внимание, что для значений без знака вам не нужно использовать один из битов для знака. Это означает, что вы получаете больший диапазон с положительной стороны (конечно, за счет отсутствия отрицательных кодировок).

И нет, 5 и -5 не могут иметь одинаковую кодировку независимо от того, какое представление вы используете. Иначе нельзя было бы отличить.

4 голосов
/ 28 сентября 2010

Стандарт C указывает, что числа без знака будут храниться в двоичном виде.(С дополнительными битами заполнения).Числа со знаком могут храниться в одном из трех форматов: величина и знак;два дополнения или одно дополнение.Интересно, что это исключает некоторые другие представления, такие как Excess-n или Base −2 .

Однако на большинстве машин и компиляторов хранят числа со знаком в дополнении 2.обычно 16 или 32 бита.Стандарт гласит, что int должно быть тем, что наиболее эффективно для базового процессора, при условии, что это >= short и <= long, тогда это разрешено стандартом.

На некоторых компьютерах и в истории ОСимеет причины int не лучший размер для текущей итерации оборудования, однако.

3 голосов
/ 18 апреля 2017

Поскольку речь идет только о памяти, в конце все числовые значения сохраняются в двоичном виде.

32-разрядное целое число без знака может содержать значения от всех двоичных 0 до всех двоичных 1.

Когда речь идет о 32-битном целом со знаком, это означает, что один из его битов (наиболее значимых) является флагом, который отмечает значение как положительное или отрицательное.

3 голосов
/ 28 сентября 2010

Вот очень хорошая ссылка, которая объясняет хранение подписанного и неподписанного INT в C -

http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O

Взято из этой статьи - процесс

"Компонент называемый два используется для преобразования положительных чисел в отрицательные числа. Побочным эффектом этого является то, что старший значащий бит используется, чтобы сообщить компьютеру, является ли число положительным или отрицательным. Если старший значащий бит равен 1, то числоотрицательно. Если это 0, число положительно. "

0 голосов
/ 28 сентября 2010

Предполагая, что int является 16-битным целым числом (которое зависит от реализации C, в настоящее время большинство из них 32-битные), битовое представление отличается следующим образом:

 5 = 0000000000000101
-5 = 1111111111111011

если двоичный 1111111111111011 будет установлен в беззнаковое целое, он будет десятичным 65531.

...