Подтвердить что ты не робот

В чем разница между unsigned int и подписанным int в C?

Рассмотрим следующие определения:

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

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

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

4b9b3361

Ответ 1

ISO C заявляет, каковы различия.

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

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

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

        two 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 не могут иметь одинаковую кодировку независимо от того, какое представление вы используете. В противном случае не было бы возможности сказать разницу.

Ответ 2

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

Однако на большинстве машин и компиляторов хранятся подписанные числа в 2 дополнениях.

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

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

Ответ 3

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

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

Взято из этой статьи -

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

Ответ 4

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

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

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

Ответ 5

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

 5 = 0000000000000101
-5 = 1111111111111011

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