2013-06-09 10 views
8

W uzupełnieniu do 2, 0-127 jest reprezentowane jako 00000000 do 01111111. W przypadku liczb ujemnych, odwracamy wszystkie bity w niepodpisanej reprezentacji i dodajemy 1, aby uzyskać dopełnienie dwójki.-128 i 128 w uzupełnieniu do 2-u:

(Reference: http://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement)

tak -1 w 2 uzupełnień będą:

 

unsigned 1 =  00000001 

invert all bits = 11111110 

add 1 =   11111111 

Ale -128, jeśli będziemy przestrzegać tych samych czynności:

 

unsigned 128 = 10000000 

invert all bits= 01111111 

add 1=   10000000 

tak - 128 i 128 mają tę samą reprezentację w notacji uzupełnienia 2? Dlaczego zakres 2 elementów uzupełniających dla 8 bitów nie jest określony jako -127 do 128? Krótko mówiąc, dlaczego -128 wolało od reprezentowania bez znaku 128 przy użyciu tej samej liczby bitów?

+1

'8h 'i tak nie jest preferowane. Ponieważ najważniejszy bit jest ustawiony, jest uważany za negatywny, prosty i prosty. – tay10r

Odpowiedz

7

W podpisanym bajcie nie ma "128". Zakres jest

  • 0 do 127: 128 wartości
  • -1 do -128: 128 wartości

Wszystkie wartości 256, to znaczy 2^8.

Uzupełnienie na podstawie komentarza (i rereading pytanie)

0x80 mogły zostać uznane za -128 lub +128. Wikipedia explanation jest warte przeczytania

Uzupełnienie dwójki minimalnej liczby w zakresie nie przyniesie pożądanego skutku zanegowania liczby.

Na przykład uzupełnienie dwójki -128 w systemie ośmiobitowym powoduje otrzymanie tej samej liczby binarnej. Jest tak dlatego, że wartość dodatnia 128 nie może być reprezentowana przez 8-bitową liczbę binarną ze znakiem. Należy zauważyć, że jest to wykrywane jako warunek przepełnienia, ponieważ było przeniesienie do najbardziej znaczącego bitu, ale nie na zewnątrz. Może to prowadzić do nieoczekiwanych błędów polegających na tym, że niesprawdzona implementacja wartości bezwzględnej może zwrócić liczbę ujemną w przypadku minimum ujemnego. Rodzina abs funkcji całkowitych w C zazwyczaj ma takie zachowanie. Dotyczy to również Javy. W takim przypadku deweloper decyduje, czy przed wywołaniem funkcji zostanie sprawdzona minimalna wartość ujemna.

Najbardziej ujemna liczba w uzupełnieniu dwójki jest czasami nazywana "dziwną liczbą", ponieważ jest to jedyny wyjątek. Chociaż liczba jest wyjątkiem, jest to poprawna liczba w regularnych układach uzupełniających dwóch. Wszystkie operacje arytmetyczne działają z nim zarówno jako operandem, jak i (chyba że wystąpił nadmiar) wynikiem.

Ponadto prawo przesunięcia podpisaną całkowitą musiałby CPU propagacji MSB (bit 7) w prawo, co byłoby niezgodne prostą logikę jeśli 0x80 to +128, jak, po tylko jednej zmiany, my by uzyskać 0xC0, która jest liczbą ujemną (-64) ... (podczas gdy przesunięcie w prawo od liczby dodatniej może normalnie, nigdy nie dają wyniku ujemnego).

6

-128 jest preferowany od 128, ze względu na konwencję bitową znaku. W podpisanej reprezentacji liczb najważniejszy bit jest uważany za bit znaku. Jeśli ten bit jest równy 1, liczba jest ujemna.W reprezentacji 128 i -128 (10000000) ten bit ma wartość 1, więc oznacza to, -128, a nie 128.

Zobacz http://en.wikipedia.org/wiki/Sign_bit

+0

A także reprezentujący jedyne zero w zestawie z niczym oprócz 0x0 byłoby trochę głupio. – Humungus

+0

Dobre krótkie wyjaśnienie. Myślę, że ta odpowiedź w połączeniu z odpowiedzią ring0 (z edycją dokonaną przez ollb) odpowiada właściwie na moje pytanie. Rewizja. Dzięki. – Karan

1

w celu utrzymania MSB jako bit znaku