Чому мінімальне значення 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 нулі, не відповідає шаблону, необхідному для підписаних значень.
supercat

4

В основному існують три способи представлення підписаних цілих чисел у двійковій формі: 2 - доповнення, 1 - доповнення та величина знаків. (Бікінарій давно пішов шляхом птаха Додо.)

Доповнення та величина знаку 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 скорочується у бік нескінченності. Я навчився цього твердого шляху ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.