Dlaczego minimalna wartość liczb całkowitych, podwójnych itp. 1 jest większa od zera niż wartość dodatnia?


10

Wiem, że ma to coś wspólnego z uzupełnieniem 2 i dodaniem 1, ale tak naprawdę nie rozumiem, w jaki sposób można zakodować jeszcze jedną liczbę z taką samą liczbą bitów, jeśli chodzi o liczby ujemne.


3
Naprawdę przykre jest to, że Abs (MinValue) jest negatywny.
OldFart

1
w java Double.MIN_VALUE jest najmniejszą wartością dodatnią , a (rzeczywiste) liczby najbardziej oddalone od zera mają równą wielkość (ponieważ ma odpowiedni bit znaku)
maniak zapadkowy

Odpowiedzi:


16

Pomyśl o tym w tych kategoriach. Weź 2-bitową liczbę z poprzedzającym znakiem:

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

Teraz mamy kilka negatywów:

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

Czekaj, my też mamy

100 ... 

Musi być ujemny, ponieważ bitem znaku jest 1. Więc logicznie musi być -4.

(Edycja: Jak słusznie zauważa WorldEngineer , nie wszystkie systemy numeracji działają w ten sposób - ale te, o które pytasz, czynią.)


11

Ponieważ nie ma dwóch klas liczb w zakresie liczb całkowitych, ale trzy: liczby ujemne, zero i liczby dodatnie. Zero musi zająć miejsce (byłoby raczej niepraktyczne nie być w stanie reprezentować zera ...), więc albo klasa pozytywna, albo negatywna musi zrezygnować z miejsca. Fakt, że zwykle jest to dodatni zasięg, który musi sprawić, że poświęcenie jest w pewnym stopniu arbitralne, ale na poziomie manipulacji bitami istnieją pewne rzeczy, które sprawiają, że ta decyzja jest wygodniejsza.


To nie tylko drobna manipulacja. Zbiór 32-bitowych liczb ze znakiem jest zbiorem liczb, których reprezentacja binarna ma taką samą wartość we wszystkich bitach po 31., a jedna taka liczba ma nieskończony zestaw jedynek, po których następuje 31 zer. Addytywna odwrotność tej liczby, nieskończony ciąg zer, po których następuje pojedynczy 1 i 31 zer, nie pasuje do wzorca wymaganego dla podpisanych wartości.
supercat

4

Istnieją zasadniczo trzy sposoby reprezentowania liczb całkowitych ze znakiem w postaci binarnej: uzupełnienie 2, uzupełnienie 1 i wielkość znaku. (Dawno temu Biquinary poszedł w ślady ptaka Dodo.)

Uzupełnienie 1 i wielkość znaku mają dwie wartości zerowe, +0 i -0, każda z unikalną reprezentacją. Uzupełnienie 2 ma tylko jedną wartość zerową i jedną reprezentację.

Teraz pole N bitów może kodować 2 ^ N wartości. Odejmij uzupełnienie jeden na 2, a otrzymasz 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Ponieważ reprezentacja dla zera to wszystkie bity zerowe, a znak + to zero, będzie jeszcze jedna możliwa niezerowa reprezentacja z bitem znaku ustawionym na 1.

Jest to bardzo długi sposób na powiedzenie, że uzupełnienie 2 reprezentuje wartości z zakresu - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1).

Uzupełnienie 1 ma przewagę nad uzupełnieniem 2, jeśli wykonujesz obliczenia na cyfrowym przetwarzaniu sygnałów całkowitoliczbowych. Operacje uzupełniania 1 są z natury skracane do zera. Uzupełnienie 2 skraca się w kierunku-nieskończoności. Nauczyłem się tego trudnym sposobem ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.