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.
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=0001=1010=2011=3
Teraz mamy kilka negatywów:
111=-1110=-2101=-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ą.)
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 ...
Odpowiedzi:
Pomyśl o tym w tych kategoriach. Weź 2-bitową liczbę z poprzedzającym znakiem:
Teraz mamy kilka negatywów:
Czekaj, my też mamy
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ą.)
źródło
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.
źródło
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 ...
źródło