Почему минимальное значение ints, doubles и т. Д. На 1 больше нуля, чем положительное значение?


10

Я знаю, что это как-то связано с дополнением 2 и добавлением 1, но я не совсем понимаю, как можно кодировать еще одно число с таким же количеством битов, когда речь идет о отрицательных числах.


3
Действительно неприятной частью этого является то, что Abs (MinValue) является отрицательным.
OldFart

1
в java Double.MIN_VALUE - это наименьшее положительное значение, и (действительные) числа, наиболее удаленные от нуля, имеют равную величину (поскольку у них есть собственный знаковый бит)
трещотка урод

Ответы:


16

Думайте об этом в этих терминах. Возьмите 2-битное число с предшествующим знаком:

000 = 0
001 = 1
010 = 2
011 = 3

Теперь давайте немного негативов:

111 = -1
110 = -2
101 = -3

Подождите, у нас также есть

100 ... 

Он должен быть отрицательным, поскольку бит знака равен 1. Так что, по логике, он должен быть -4.

(Правка: как справедливо отмечает WorldEngineer , не все системы нумерации работают таким образом, но те, о которых вы просите, работают.)


11

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


Это не просто битовые манипуляции. Набор из 32-разрядных чисел со знаком - это набор чисел, двоичное представление которых имеет одинаковое значение во всех битах после 31-го, и одно такое число имеет бесконечный набор единиц, за которыми следует 31 ноль. Аддитивная инверсия этого числа, бесконечная цепочка нулей, за которой следуют одиночные нули 1 и 31, не соответствует шаблону, требуемому для знаковых значений.
суперкат

4

Существуют три основных способа представления целых чисел со знаком в двоичном виде: дополнение 2, дополнение 1 и величина знака. (Biquinary давно прошел путь от Птицы Додо.)

1 дополнение и знак-величина имеют два нулевых значения, +0 и -0, каждое с уникальным представлением. Дополнение 2 имеет только одно нулевое значение и одно представление.

Теперь поле из N битов может кодировать 2 ^ N значений. Вычтите одно в 2 дополнения, и вы получите 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Поскольку представление для нуля - это все нулевые биты, а знак + - это ноль, будет еще одно возможное ненулевое представление с битом знака, установленным в 1.

Это очень многословный способ сказать, что дополнение 2 представляет значения в диапазоне - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1).

Дополнение 1 на самом деле имеет преимущество перед дополнением 2, если вы выполняете вычисления для обработки целочисленных цифровых сигналов. Операции дополнения 1 по сути усекаются до нуля. Комплемент 2 усекается в направлении -infinity. Я узнал этот трудный путь ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.