Почему диапазон int от -32768 до 32767? [закрытый]

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

например, в случае целого числа:

на Turbo C диапазон -32768 до 32767 и Visual Studio это -2147483648 to 2147483647.

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

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

5 ответов


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

помните, что все переменные имеют определенное количество битов. Если самый значительный из них, тот, что слева, равен 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^(n-1)- 2^n равно - (2^(n - 1)), а ((2^n) - 1) - 2^n равно -1. Поэтому диапазон отрицательных чисел равен - (2^(n - 1)) -1.

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

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


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

ваш вопрос относится только к варианту дополнения двух, и причина этого проста. С 16 битами вы можете представлять 216 (или 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

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

для более полного объяснения того, как работает дополнение two, см. Википедия страницы.


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


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


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

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