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