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

Почему диапазон значений int составляет от -32768 до 32767?

Почему диапазон любого типа данных больше на отрицательной стороне по сравнению с положительной стороной?

Например, в случае целых чисел:

В Turbo C его диапазон от -32768 до 32767, а для Visual Studio - -2147483648 до 2147483647.

То же самое происходит с другими типами данных...

[UPD: установите правильные предельные значения для Visual Studio]

4b9b3361

Ответ 1

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

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

Однако, если крайний левый бит равен 1, то число отрицательно. Реальное значение числа может быть получено путем вычитания 2 ^ n из всего представленного числа (как беззнаковая величина, включая крайний левый 1), где n - количество бит, которое имеет переменная.

Поскольку для фактического значения ( "мантисса" ) числа осталось только n - 1 бит, возможные комбинации 2 ^ (n - 1). Для положительных/нулевых чисел это легко: они идут от 0 до 2 ^ (n - 1) - 1. То, что -1 должно учитывать сам ноль - например, если у вас было только четыре возможных комбинации, эти комбинации будет представлять 0, 1, 2 и 3 (обратите внимание, как там четыре числа): оно идет от 0 до 4 - 1.

Для отрицательных чисел помните, что самый левый бит равен 1, поэтому все представленное число идет между 2 ^ (n - 1) и (2 ^ n) - 1 (здесь важны круглые скобки!). Однако, как я уже сказал, вам нужно взять 2 ^ n, чтобы получить реальное значение числа. 2 ^ (п - 1) - 2 ^ п - - (2 ^ (п - 1)), а ((2 ^ п) - 1) - 2 ^ п - -1. Следовательно, диапазон отрицательных чисел - (2 ^ (n - 1)) до -1.

Поместите все это вместе, и вы получите -2 ^ (n - 1) до 2 ^ (n - 1) - 1. Как вы можете видеть, верхняя граница получает -1, что нижняя граница не имеет.

И вот почему еще одно отрицательное число, чем положительное.

Ответ 2

Минимальный диапазон, требуемый C, на самом деле - от 32767 до 32767, потому что он должен обслуживать два дополнения, их дополнение и кодировку знака/величины для отрицательных чисел, что позволяет стандарт C. См. Annex E, Implementation limits для C11 (и C99) для получения подробной информации о минимальных диапазонах для типов данных.

Ваш вопрос относится только к двум вариантам дополнения, и причина этого проста. С 16 битами вы можете представить 2 16 (или 65 536) разные значения, а ноль должен быть одним из них. Следовательно, осталось нечетное число значений, большинство из которых (на единицу) являются отрицательными значениями:

 1 thru  32767  = 37267 values
 0              =     1 value
-1 thru -32768  = 32768 values
                  -----
                  65536 values

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

 1 thru  32767  = 37267 values
 0              =     1 value
-0              =     1 value
-1 thru -32767  = 32767 values
                  -----
                  65536 values

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

Для более полного объяснения того, как работают два дополнения, см. страницу wikipedia.

Ответ 3

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

Ответ 4

Поскольку диапазон включает в себя нуль. Количество различных значений, которое может представлять n-разрядное целое число, равно 2 ^ n. Это означает, что 16-разрядное целое число может представлять 65536 различных значений. Если это 16-разрядное целое без знака, оно может представлять 0-65535 (включительно). Соглашение для целых чисел со знаком должно представлять от 32768 до 32767, от -214748368 до 214748367 и т.д.

Ответ 5

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

Диапазон должен быть: - (2 ^ (n-1)) - ((2 ^ (n-1) -1)