logo

Uzupełnienie dwójki

Istnieją trzy różne sposoby przedstawiania liczby całkowitej ze znakiem (artykuł). a: bit ze znakiem, b: uzupełnienie 1 i c: uzupełnienie 2. Spróbujmy zrozumieć, w jaki sposób wyprowadzono te metody i dlaczego uzupełnienie do 2 jest preferowane w stosunku do innych.

Jak wiemy, dane są przechowywane w bitach. Jak możemy przechowywać liczbę całkowitą ze znakiem w pamięci? Aby rozwiązać ten problem, najpierw opracujemy rozwiązanie naiwne, a następnie będziemy je powtarzać, aż znajdziemy najlepsze rozwiązanie naszego problemu.



a) Bit ze znakiem

Próbując zapisać liczbę całkowitą ze znakiem, oczywiste wydaje się zarezerwowanie lewego bitu najbardziej na znak i wykorzystanie pozostałych bitów do faktycznego przechowywania wartości. Na przykład: w systemie 4-bitowym pierwszy bit od lewej strony będzie zarezerwowany na znak (0 oznacza wartość dodatnią, a 1 oznacza wartość ujemną), a pozostałe 3 bity zostaną wykorzystane do przechowywania wartości. Podobnie w systemie 8-bitowym pierwszy bit od lewej będzie używany jako znak, a pozostałe 7 jako wartości.

Pan Nie.

Reprezentacja binarna



Wartość dziesiętna

A

0000



+0

B

0001

+1

C

0010

+2

D

0011

+3

I

0100

+4

F

0101

+5

G

0110

+6

H

0111

+7

I

1000

-0

J

1001

-1

K

1010

-2

L

1011

-3

M

1100

-4

N

1101

-5

O

1110

-6

P

1111

-7

Stosując to podejście, jesteśmy w stanie z powodzeniem przedstawić liczbę całkowitą ze znakiem. Kiedy jednak przeanalizujemy to bliżej, możemy zauważyć następujące wady:

1) Dwie reprezentacje zera:

W systemie 4-bitowym powinniśmy być w stanie zapisać 16 (24) wartości, ale +1 do +7 i -1 do -7 to tylko 14 wartości. Gdzie znajdują się pozostałe dwie wartości? Kiedy uważnie przyjrzymy się tabeli, odkryjemy, że te dwie wartości zbiegają się do 0. Mamy zatem dwie reprezentacje zera, co oznacza jedną reprezentację dla +0 i drugą dla -0.

Ale czy dwie reprezentacje 0 są dużym problemem? Więc co? Zamiast 16 unikalnych wartości jesteśmy w stanie przechowywać tylko 15 wartości. Możemy sobie pozwolić na zmniejszenie zakresu o 1, prawda? Dla twórcy oprogramowania może to nie dotyczyć, ale dla projektanta obwodów bardzo frustrujące może być sprawdzenie najpierw, czy wartość wynosi +0, a następnie sprawdzenie, czy wynosi -0.

2) Podpisane rozszerzenie nie działa dla liczb ujemnych:

Rozmiar danych szybko rośnie. Kiedyś będziemy musieli rozszerzyć system bitowy, abyśmy mogli zwiększyć zakres danych, które można przechowywać. W 2014 roku film Gangnam Style przekroczył limit wyświetleń w YouTube, co zmusiło YouTube do zwiększenia liczby wyświetleń z 32-bitowej do 64-bitowej liczby całkowitej ze znakiem. Podobnie 32-bitowy zegar Uniksa przepełni się 19 stycznia 2038 r., ponieważ rejestruje czas w sekundach w 32-bitowej liczbie całkowitej ze znakiem.

Zatem równie ważne jest, aby nasz system reprezentacji dawał się łatwo rozszerzać, co nie jest możliwe w przypadku tego systemu reprezentacji.

Dziesiętny

4-bitowy

5-bitowy

6-bitowy

+2

0010

00010

000010

+7

0111

00111

000111

-2

1010

10010 (!= 11010)

100010 (!= 111010)

-7

1111

10111 (!= 11111)

100111 (!= 111111)

3) Dodawanie binarne nie działa:

Spróbujmy dodać dwie liczby binarne:

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Numer 1

0010

+2

0111

+7

1101

-5

Numer 2

1010

-2

1010

-2

0011

+3

Dodatek binarny

1100

-4

0001

+1

0000

+0

Dodawanie dziesiętne

+0

+5

-2

Dlaczego prosty dodatek binarny tutaj nie działa? Powodem jest to, że bit znaku (najbardziej z lewej strony) nie jest zwykłym bitem i nie jest częścią rzeczywistej liczby. Wyobraźmy sobie sytuację, w której trzeba zaprojektować obwód sprzętowy tak, aby ignorował bit znaku w celu wykonania dodawania, a następnie dołączyć bit znaku.

Był to więc naiwny sposób przedstawiania liczby całkowitej ze znakiem. Główny problem związany z tym podejściem polega na tym, że liczby ujemne odwzorowaliśmy w dół. Jeśli zmienimy nasz system mapowania na niższy, niektóre z powyższych problemów zostaną rozwiązane.

b) 1’s Co wdrożyć

Jeśli przemapujemy nasze liczby ujemne z góry na dół, otrzymamy następującą tabelę binarną:

Tak nie.

Reprezentacja binarna

Wartość dziesiętna

uzupełnienie 1

Podpisano bit

A

0000

+0

+0

B

0001

+1

+1

C

0010

+2

+2

D

0011

+3

+3

I

0100

+4

+4

F

0101

+5

+5

G

0110

+6

+6

H

0111

+7

+7

I

1000

-7

-0

J

1001

-6

-1

K

1010

-5

-2

L

1011

-4

-3

M

1100

-3

-4

N

1101

-2

-5

O

1110

-1

-6

P

1111

-0

-7

Jak uzyskać binarną reprezentację liczby całkowitej w metodzie uzupełnienia do 1?

  • Liczby dodatnie są reprezentowane podobnie jak metoda liczb całkowitych ze znakiem
  • Liczby ujemne są reprezentowane przez odwrócenie każdego bitu odpowiedniej liczby dodatniej (odwrócenie można łatwo wykonać za pomocą bramki NOT podczas projektowania sprzętu)

Przeanalizujmy to dokładnie, aby sprawdzić, czy osiągnęliśmy pewną poprawę.

1) Dwie reprezentacje zera:

W tym podejściu również mamy dwie reprezentacje zera.

2) Podpisane rozszerzenie nie działa dla liczb ujemnych:

Podpisane rozszerzenie działa doskonale w przypadku liczb ujemnych.

Dziesiętny

4-bitowy

5-bitowy

6-bitowy

+2

0010

00010

000010

+7

0111

00111

000111

-2

1101

11101

111101

-7

1000

11000

111000

3) Dodawanie binarne działa ze zmodyfikowanymi regułami:

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

wiek Hrithika Roshana
Dwójkowy

Dziesiętny

Numer 1

0010

+2

0111

+7

1010

-5

Numer 2

1101

-2

1101

-2

0011

+3

Dodatek binarny

1111

-0

0100

+4

1101

-2

Dodawanie dziesiętne

+0

+5

-2

Odpowiedź nie zawsze jest prawidłowa, ale jest bardzo bliska prawidłowej. Możemy sprawić, że to zadziała, jeśli będziemy przestrzegać tej zasady jeśli wygenerowałeś przeniesienie do przodu po lewej stronie, nie wyrzucaj go, zamiast tego przynieś je z powrotem i dodaj po prawej stronie.

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Numer 1

0111

+7

1110

-1

0111

+7

Numer 2

1101

-2

1001

-6

1011

-4

Dodatek binarny

(1) 0100

+4

(1) 0111

+7

(1) 0010

+2

Dodanie przeniesienia do przodu i do tyłu

0101

+5

1000

-7

0011

+3

Zdecydowanie metoda uzupełnienia jedynki jest lepsza niż bit ze znakiem. Nasze główne obawy zostały rozwiązane, ale nadal występują problemy (posiadanie dwóch reprezentacji zera), a nasz hack w dodawaniu binarnym daje wskazówki, jak ulepszyć metodę uzupełniania jedynki. Przeformułujmy te zdania, żeby było łatwiej.

  • Mamy dodatkową reprezentację zera, która jest niepotrzebna
  • Podczas dodawania dwóch liczb binarnych, jeśli mamy przeniesienie w skrajnym lewym bicie, musimy dodać +1 do wyniku, co oznacza, że ​​właściwą odpowiedź można znaleźć, przechodząc do następnego wiersza w tabeli binarnej.

Obydwa wskazują nam, że główną przyczyną problemu jest dodatkowa reprezentacja zera. Zatem usuńmy to dodatkowe zero i przesuńmy wszystkie wartości ujemne do następnego wiersza (-7 przesunie się z I -> J, -6 przesunie się z J -> K i tak dalej…)

c) Uzupełnienie 2

Kiedy usuniemy -0 z tabeli uzupełnień do 1 i przesuniemy wszystkie wartości ujemne o jeden wiersz poniżej, otrzymamy następującą tabelę, którą nazywamy uzupełnieniem do 2:

Tak nie.

Reprezentacja binarna

Wartość dziesiętna

uzupełnienie 2

uzupełnienie 1

Podpisano bit

A

0000

+0

+0

+0

B

0001

+1

+1

+1

C

0010

+2

+2

+2

D

0011

+3

+3

+3

I

0100

+4

+4

+4

F

0101

+5

+5

+5

G

0110

+6

+6

+6

H

0111

+7

+7

+7

I

1000

-8

-7

-0

J

1001

-7

= odwrotność 7 + 1-bit

-6

-1

K

1010

-6

= odwrotność 6 + 1-bit

-5

-2

L

1011

-5

= odwrotność 5 + 1-bit

-4

-3

M

1100

-4

= odwrotność 4 + 1-bit

-3

-4

N

1101

-3

= odwrotność 3 + 1-bit

-2

-5

O

1110

-2

= odwrotność 2 + 1-bit

-1

-6

P

1111

-1

= odwrotność 1 + 1-bit

-0

-7

Jak uzyskać binarną reprezentację liczby całkowitej w metodzie uzupełnienia do 2?

  • Liczby dodatnie są reprezentowane podobnie jak metoda liczb całkowitych ze znakiem
  • Liczby ujemne są reprezentowane przez odwrócenie każdego bitu odpowiedniej liczby dodatniej, a następnie dodanie do niej 1 bitu

1) Jedna reprezentacja zera:

Teraz mamy tylko jedną reprezentację zera i pozwala nam to przechowywać łącznie 16 unikalnych wartości (+0 do +7 i -1 do -8).

2) Podpisane rozszerzenie działa dla liczb ujemnych:

Podpisane rozszerzenie działa doskonale w przypadku liczb ujemnych.

Dziesiętny

4-bitowy

5-bitowy

6-bitowy

+2

0010

00010

000010

+7

0111

00111

000111

-2

1110

11110

111110

-7

1001

11001

111001

3) Dodawanie binarne:

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Numer 1

0010

+2

0111

+7

1011

-5

1111

-1

Numer 2

1110

-2

1110

-2

0011

+3

1010

-6

Odpowiedź

0000

+0

0101

+5

1110

-2

1001

-7

4) Pierwszy bit jest bitem ze znakiem:

Dopełnienie do 2 ma tę ciekawą właściwość, że pierwszy bit jest bitem znaku, ponieważ wszystkie dodatnie zaczynają się od 0, a wszystkie ujemne od 1.

5) Kontrola przepełnienia pamięci:

Dodając, upewniliśmy się, że nasza odpowiedź mieści się w zakresie, ale podczas projektowania sprzętu należy wykryć przepełnienie pamięci. Sprawdzanie wielkości w celu wykrycia przepełnienia będzie bardzo złym pomysłem dla projektantów sprzętu. Metoda uzupełnienia 2 zapewnia bardzo prosty sposób na wykrycie przepełnienia pamięci. I f przeniesienie do bitu ze znakiem nie jest równoznaczne z przeniesieniem bitu ze znakiem, to mamy do czynienia z przepełnieniem pamięci tj. jeśli przeniesienie do bitu ze znakiem wynosi 0, ale wykonanie wynosi 1 lub jeśli przeniesienie wynosi 1, ale wykonanie wynosi 0, to jest to przypadek przepełnienia pamięci.

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Dwójkowy

Dziesiętny

Numer 1

1011

-5

0010

2

0111

+7

1011

cyfry rzymskie 1 100
-5

Numer 2

1100

-4

0110

6

1110

-2

0011

3

Dodatek

(1) 0111

(0)1000

(1)0101

(0)1110

przenieś, aby się podpisać

0

przelewowy

1

przelewowy

1

NIE

0

NIE

wykonać, aby podpisać bit

1

0

1

0