logo

Complementul a doi

Există trei moduri diferite de a reprezenta un întreg cu semn (articol). a: bit semnat, b: complementul 1 și c: complementul 2. Să încercăm să înțelegem cum au derivat aceste metode și de ce complementul 2 este preferat față de altele.

După cum știm, datele sunt stocate în biți. Cum putem stoca un întreg cu semn în memorie? Pentru a rezolva această problemă, mai întâi vom dezvolta o soluție naivă și apoi o vom repeta până când vom avea cea mai bună soluție pentru problema noastră.



a) Bit semnat

Când încercați să stocați un număr întreg cu semn, pare evident să rezervați bitul cel mai din stânga pentru semn și să folosiți biții rămași pentru a stoca efectiv valorile. De exemplu: în sistemul pe 4 biți, primul bit din stânga va fi rezervat pentru semn (0 reprezintă pozitiv, în timp ce 1 reprezintă negativ) și alți 3 biți vor fi folosiți pentru a stoca valorile. În mod similar în sistemul de 8 biți, primul bit din stânga va fi folosit pentru semn și restul de 7 vor fi folosiți pentru valori.

domnule nr.

Reprezentare binară



Valoare zecimală

A

0000



+0

B

0001

+1

C

0010

+2

D

0011

+3

ȘI

0100

+4

F

0101

+5

G

0110

+6

H

0111

+7

eu

1000

-0

J

1001

-1

K

1010

-2

L

1011

-3

M

1100

-4

N

1101

-5

O

1110

-6

P

1111

-7

Folosind această abordare, suntem capabili să reprezentăm cu succes întregul cu semn. Dar când o analizăm mai atent, am putea observa următoarele dezavantaje:

1) Două reprezentări ale lui zero:

În sistemul pe 4 biți, ar trebui să putem stoca 16 (24) valori, dar de la +1 la +7 și de la -1 la -7 sunt doar 14 valori. Unde sunt cele două valori rămase? Când observăm cu atenție tabelul, vom afla că acele două valori converg către 0. Astfel, avem două reprezentări de zero, adică o reprezentare pentru +0 și alta pentru -0.

Dar sunt două reprezentări ale lui 0 o mare îngrijorare? Şi ce dacă? În loc de 16 valori unice, putem stoca doar 15 valori. Ne putem permite să reducem intervalul cu 1, nu-i așa? Pentru dezvoltatorul de software, s-ar putea să nu fie îngrijorător, dar pentru un proiectant de circuite ar putea fi foarte frustrant să verifice mai întâi dacă valoarea este +0 și apoi să verifice dacă este -0.

2) Extensia semnată nu funcționează pentru numere negative:

Dimensiunea datelor crește rapid. De ceva timp trebuie să extindem sistemul de biți, astfel încât să putem crește gama de date care pot fi stocate. În 2014, videoclipul Gangnam Style a depășit limita de vizionări YouTube și a forțat YouTube să actualizeze numărul de vizionări de la 32 de biți la 64 de biți. În mod similar, ceasul Unix pe 32 de biți va depăși pe 19 ianuarie 2038, deoarece înregistrează timpul în secunde într-un număr întreg semnat pe 32 de biți.

Deci, este la fel de important ca sistemul nostru de reprezentare să fie extensibil cu ușurință, ceea ce nu este posibil cu acest sistem de reprezentare.

Zecimal

4 biți

5 biți

6 biți

+2

0010

00010

000010

+7

0111

00111

000111

-2

1010

10010 (!= 11010)

100010 (!= 111010)

-7

1111

10111 (!= 11111)

100111 (!= 111111)

3) Adunarea binară nu funcționează:

Să încercăm să adunăm două numere binare:

Binar

Zecimal

Binar

Zecimal

Binar

Zecimal

Numărul 1

0010

+2

0111

+7

1101

-5

Numarul 2

1010

-2

1010

-2

0011

+3

Adăugarea binară

1100

-4

0001

+1

0000

+0

Adunare zecimală

+0

+5

-2

De ce nu funcționează o simplă adăugare binară aici? Motivul este că bitul de semn (cel mai din stânga) nu este un bit obișnuit și nu face parte din numărul real. Imaginați-vă situația în care trebuie să proiectați circuitul hardware pentru a ignora bitul semn pentru a efectua adăugarea și apoi adăugați bitul semn.

Deci, acesta a fost un mod naiv de a reprezenta un întreg cu semn. Principala problemă a acestei abordări este că am mapat numerele negative în jos în sus. Dacă ne schimbăm sistemul de cartografiere de sus în jos, unele dintre problemele de mai sus vor fi rezolvate.

b) 1's Co implementa

Dacă remapăm numerele noastre negative de sus în jos, atunci vom obține următorul tabel binar:

Da nu.

Reprezentare binară

Valoare zecimală

complementul lui 1

Bit semnat

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

eu

1000

-7

-0

J

1001

-6

-1

diana mary blacker
K

1010

-5

-2

L

1011

-4

-3

M

1100

-3

-4

N

1101

-2

-5

O

1110

-1

-6

P

1111

-0

-7

Cum să obțineți reprezentarea binară a unui număr întreg în metoda complementului 1?

  • Numerele pozitive sunt reprezentate similar cu metoda întregului cu semn
  • Numerele negative sunt reprezentate prin inversarea fiecărui bit al numărului pozitiv corespunzător (inversarea poate fi făcută cu ușurință prin utilizarea porții NOT în timpul proiectării hardware)

Să analizăm acest lucru îndeaproape pentru a vedea dacă am realizat unele îmbunătățiri.

1) Două reprezentări ale lui zero:

În această abordare avem și două reprezentări ale lui zero.

2) Extensia semnată nu funcționează pentru numere negative:

Extensia semnată funcționează perfect pentru numere negative.

Zecimal

4 biți

5 biți

6 biți

+2

0010

00010

000010

+7

0111

00111

000111

-2

1101

11101

111101

-7

1000

11000

111000

3) Adunarea binară funcționează cu reguli modificate:

Binar

Zecimal

Binar

Zecimal

Binar

Zecimal

Numărul 1

0010

+2

0111

+7

1010

-5

Numarul 2

1101

-2

1101

-2

0011

+3

Adăugarea binară

1111

-0

0100

+4

1101

-2

Adunare zecimală

+0

+5

-2

Răspunsul nu este întotdeauna corect, dar este foarte aproape de răspunsul corect. O putem face să funcționeze dacă respectăm regula că dacă ați generat transferul înainte pe partea din stânga, atunci nu-l aruncați, ci aduceți-l înapoi și adăugați-l în partea din dreapta.

Binar

Zecimal

Binar

Zecimal

Binar

Zecimal

Numărul 1

0111

+7

1110

-1

0111

+7

Numarul 2

1101

-2

1001

-6

1011

-4

Adăugarea binară

(1) 0100

+4

(1) 0111

+7

(1) 0010

+2

Se adaugă transferul înainte înapoi

0101

+5

1000

-7

0011

+3

Cu siguranță metoda complementului 1 este mai bună decât bitul cu semn. Preocupările noastre majore sunt rezolvate, dar rămân o problemă (având două reprezentări de zero) și hack-ul nostru în adăugare binară oferă indicii pentru a îmbunătăți metoda complementului 1. Să reformulăm acele propoziții pentru a fi mai ușor.

  • Avem o reprezentare suplimentară a zero, care este inutilă
  • În timp ce adăugăm două numere binare, dacă avem un report în cel mai din stânga bit, atunci trebuie să adăugăm +1 la rezultat, adică răspunsul corect poate fi găsit parcurgând în jos la rândul următor din tabelul binar.

Ambele ne îndrumă că o reprezentare suplimentară a zero este cauza principală a problemei. Deci, să eliminăm acest zero suplimentar și să mutam toate valorile negative pe rândul următor (-7 se va muta de la I -> J, -6 se va muta de la J -> K și așa mai departe...)

c) Complementul 2

Când eliminăm -0 din tabelul complementului 1 și deplasăm toate valorile negative cu un rând mai jos, atunci vom obține următorul tabel care se numește complement 2:

Da nu.

Reprezentare binară

Valoare zecimală

complementul lui 2

complementul lui 1

Bit semnat

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

eu

1000

-8

-7

-0

J

1001

-7

= inversul lui 7 + 1-bit

-6

-1

K

1010

-6

= inversul lui 6 + 1-bit

-5

-2

L

1011

-5

= inversul lui 5 + 1-bit

-4

-3

M

1100

-4

= inversul lui 4 + 1-bit

-3

-4

N

1101

-3

= inversul lui 3 + 1-bit

-2

-5

O

1110

-2

= inversul lui 2 + 1-bit

-1

-6

P

1111

-1

= inversul lui 1 + 1-bit

-0

-7

Cum se obține o reprezentare binară a unui număr întreg în metoda complementului 2?

  • Numerele pozitive sunt reprezentate similar cu metoda întregului cu semn
  • Numerele negative sunt reprezentate inversând fiecare bit al numărului pozitiv corespunzător, apoi adăugându-i 1 bit

1) O reprezentare a lui zero:

Acum avem o singură reprezentare a lui zero și ne permite să stocăm totalizează 16 valori unice (de la +0 la +7 și de la -1 la -8).

2) Extensia semnată funcționează pentru numere negative:

Extensia semnată funcționează perfect pentru numere negative.

Zecimal

4 biți

5 biți

6 biți

+2

0010

00010

000010

+7

0111

00111

000111

-2

1110

11110

111110

-7

1001

11001

111001

3) Adunare binară:

Binar

Zecimal

Binar

Zecimal

Binar

Zecimal

Binar

Zecimal

Numărul 1

0010

+2

0111

long to string java
+7

1011

-5

1111

-1

Numarul 2

1110

-2

1110

-2

0011

+3

1010

-6

Răspuns

0000

+0

0101

+5

1110

-2

1001

-7

4) Primul bit este un bit semnat:

Complementul lui 2 are această proprietate frumoasă că primul bit este un bit semn, deoarece toate pozitive încep cu 0, în timp ce toate negative cu 1.

5) Verificarea depășirii memoriei:

În timp ce am făcut adaos, ne-am asigurat că răspunsul nostru este în interval, dar în timpul proiectării hardware, trebuie detectat depășirea memoriei. Ar fi o idee foarte proastă ca designerii de hardware să verifice magnitudinea pentru a prinde preaplin. Metoda complementului 2 oferă o modalitate foarte simplă de a detecta depășirea memoriei. eu f carry in to signed bit nu este egal cu carry out of signed bit, atunci este cazul de depășire a memoriei adică, dacă transferul la bitul semnat este 0, dar executarea este 1 sau dacă transferul în 1, dar executarea este 0, atunci este cazul de depășire a memoriei.

Binar

Zecimal

Binar

Zecimal

Binar

Zecimal

Binar

Zecimal

Numărul 1

1011

-5

0010

2

0111

+7

1011

-5

Numarul 2

1100

-4

0110

6

1110

-2

0011

3

Plus

(1) 0111

(0)1000

(1)0101

(0)1110

carry in to sign bit

0

revărsare

1

revărsare

1

Nu

0

Nu

efectuează să semneze bit

1

0

1

0