Рассмотрим следующие определения:
int x=5;
int y=-5;
unsigned int z=5;
Как они хранятся в памяти? Может ли кто-нибудь объяснить их представление в памяти?
Может ли int x=5
и int y=-5
иметь такое же представление битов в памяти?
Рассмотрим следующие определения:
int x=5;
int y=-5;
unsigned int z=5;
Как они хранятся в памяти? Может ли кто-нибудь объяснить их представление в памяти?
Может ли int x=5
и int y=-5
иметь такое же представление битов в памяти?
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 |
+---------------------+---------------------+---------------------+
Обратите внимание, что положительные значения имеют одинаковую кодировку для всех представлений, только отрицательные значения различаются.
Обратите внимание, что для неподписанных значений вам не нужно использовать один из битов для знака. Это означает, что вы получаете больше диапазона с положительной стороны (конечно, без отрицательных кодировок).
И нет, 5
и -5
не могут иметь одинаковую кодировку независимо от того, какое представление вы используете. В противном случае не было бы возможности сказать разницу.
стандарт C указывает, что беззнаковые числа будут сохранены в двоичном формате. (С дополнительными битами заполнения). Подписанные номера могут храниться в одном из трех форматов: Magnitude and sign; два дополнения или одного дополнения. Интересно, что это исключает некоторые другие представления, такие как Excess-n или Base -2.
Однако на большинстве машин и компиляторов хранятся подписанные числа в 2 дополнениях.
int
обычно составляет 16 или 32 бит. В стандарте говорится, что int
должен быть наиболее эффективным для основного процессора, если он равен >= short
и <= long
, тогда он разрешен стандартом.
На некоторых машинах и ОС история имеет причины int
не быть лучшим размером для текущей итерации аппаратного обеспечения.
Вот очень хорошая ссылка, которая объясняет хранение подписанного и неподписанного INT в C -
http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O
Взято из этой статьи -
", называемый двумя дополнениями, используется для преобразования положительных чисел в отрицательные числа. Побочным эффектом этого является то, что самый старший бит используется, чтобы сообщить компьютеру, является ли это число положительным или отрицательным. Если самый старший бит является 1, то число отрицательно. Если оно 0, число положительное."
Поскольку все это касается памяти, в конце все числовые значения хранятся в двоичном формате.
32-разрядное целое без знака может содержать значения из всех двоичных 0 для всех двоичных 1s.
Когда дело доходит до 32-битного целого числа со знаком, это означает, что один из его битов (наиболее значимый) - это флаг, который отмечает положительное или отрицательное значение.
Предполагая, что int - это 16-битное целое число (которое зависит от реализации C, большинство из которых сейчас 32 бит), представление битов отличается следующим:
5 = 0000000000000101
-5 = 1111111111111011
если двоичный код 1111111111111011 будет установлен в unsigned int, он будет десятичным числом 65531.