Complementul a doi ( uneori „ complementul doi ” ) este cel mai comun mod de a reprezenta numerele întregi negative în computere . Vă permite să înlocuiți operația de scădere cu operația de adunare și să faceți aceleași operațiuni de adunare și scădere pentru numerele cu semn și fără semn , ceea ce simplifică arhitectura computerului . În literatura engleză, „ codul invers ” este numit „ complementul celor doi” , iar „codul suplimentar” se numește „ complementul celor doi ” .
Un cod suplimentar pentru un număr negativ poate fi obținut inversând modulul său binar și adăugând unul la inversare sau scăzând numărul de la zero.
Codul complementului doi este definit ca valoarea obținută prin scăderea numărului din cea mai mare putere a doi (din 2 N pentru complementul de secundă de N biți).
Când scrieți un număr într-un cod suplimentar, cel mai semnificativ bit este un semn. Dacă valoarea celui mai semnificativ bit este 0, atunci aceasta înseamnă că biții rămași conțin un număr binar pozitiv care se potrivește cu codul direct .
Un număr binar de 8 biți cu semn în complement a doi poate reprezenta orice număr întreg între -128 și +127 . Dacă bitul cel mai semnificativ este zero, atunci cel mai mare număr întreg care poate fi scris în restul de 7 biți este .
Exemple:
Reprezentare zecimală |
Reprezentare binară (8 biți), cod: | ||
---|---|---|---|
Drept | înapoi | adiţional | |
127 | 0111 1111 | 0111 1111 | 0111 1111 |
unu | 0000 0001 | 0000 0001 | 0000 0001 |
0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | |
-unu | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
-patru | 1000 0100 | 1111 1011 | 1111 1100 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
-6 | 1000 0110 | 1111 1001 | 1111 1010 |
-7 | 1000 0111 | 1111 1000 | 1111 1001 |
-opt | 1000 1000 | 1111 0111 | 1111 1000 |
-9 | 1000 1001 | 1111 0110 | 1111 0111 |
-zece | 1000 1010 | 1111 0101 | 1111 0110 |
-unsprezece | 1000 1011 | 1111 0100 | 1111 0101 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | --- | --- | 1000 0000 |
Același principiu poate fi folosit și în reprezentarea computerizată a oricărui sistem numeric , cum ar fi pentru numerele zecimale .
Valoarea cifrelor curente ale numărului nu este modificată, dar se adaugă cifra cea mai semnificativă a semnului, a cărei valoare este 0. De exemplu, numărul [+12'345] va avea următoarea reprezentare - [012'345 ]
Număr negativAdăugăm o cifră superioară a semnului egală cu cea mai mare cifră a acestui sistem de numere , în cazul nostru este 9 și, de asemenea, schimbăm cifrele rămase conform unei anumite reguli; lăsați valoarea cifrei fiecărei cifre să fie reprezentată de variabila x , cu excepția semnului unu, apoi imaginați-vă următorul algoritm de acțiuni:
Ideea de a reprezenta un număr zecimal (precum și orice alt) în codul de complement a doi este identică cu regulile pentru sistemul de numere binar și poate fi folosită într-un procesor ipotetic:
Obișnuit
performanţă |
Drept
Codul |
Primul
plus |
Al doilea
plus |
---|---|---|---|
... | ... | ... | ... |
+13 | 0'0013 | 0'0013 | 0'0013 |
+12 | 0'0012 | 0'0012 | 0'0012 |
+11 | 0'0011 | 0'0011 | 0'0011 |
+10 | 0'0010 | 0'0010 | 0'0010 |
+9 | 0'0009 | 0'0009 | 0'0009 |
+8 | 0'0008 | 0'0008 | 0'0008 |
... | ... | ... | ... |
+2 | 0'0002 | 0'0002 | 0'0002 |
+1 | 0'0001 | 0'0001 | 0'0001 |
+0 | 0'0000 | 0'0000 | 0'0000 |
-0 | 9'0000 | 9'9999 | 0'0000 |
-unu | 9'0001 | 9'9998 | 9'9999 |
-2 | 9'0002 | 9'9997 | 9'9998 |
-3 | 9'0003 | 9'9996 | 9'9997 |
-patru | 9'0004 | 9'9995 | 9'9996 |
... | ... | ... | ... |
-9 | 9'0009 | 9'9990 | 9'9991 |
-zece | 9'0010 | 9'9989 | 9'9990 |
-unsprezece | 9'0011 | 9'9988 | 9'9989 |
-12 | 9'0012 | 9'9987 | 9'9988 |
-13 | 9'0013 | 9'9986 | 9'9987 |
Ambele numere sunt reprezentate în complement a doi. Codul complementar al ambelor numere are același număr de cifre. În această reprezentare, numerele sunt adăugate.
Semnele sunt diferite: Dacă în procesul de adunare se formează o cifră care depășește numerele inițiale, atunci este omisă. Valoarea rezultată este considerată pozitivă în cazul în care codurile directe și complementul a doi sunt identice. În caz contrar, negativ sub forma unui cod suplimentar .
De exemplu:
Semnele sunt aceleași:
De exemplu:
Conversia unui număr dintr-un cod direct într-unul suplimentar se realizează conform următorului algoritm.
Exemplu. Să convertim numărul negativ −5, scris în codul direct, într-un cod suplimentar. Cod direct pentru un număr negativ -5:
1000 0101Inversăm toate cifrele numărului, cu excepția semnului, obținând astfel codul invers (prima adunare) a unui număr negativ -5:
1111 1010Să adăugăm 1 la rezultat, obținând astfel codul suplimentar (complement al doilea) al numărului negativ -5:
1111 1011Un algoritm similar este folosit pentru a converti numărul negativ -5 scris în codul complementar al celor doi în numărul pozitiv 5 scris în codul direct. Și anume:
1111 1011Inversăm toate cifrele numărului negativ -5, obținând astfel un număr pozitiv 4 în cod direct:
0000 0100Adăugând 1 la rezultat, obținem un număr pozitiv 5 în cod direct:
0101Și verificați adăugând cu cod suplimentar
0000 0101 + 1111 1011 = 0000 0000, cifrele a cincea și mai mari sunt eliminate.În sistemul numerelor p -adice, schimbarea semnului unui număr se realizează prin conversia numărului în codul său suplimentar. De exemplu, dacă sistemul numeric este 5, atunci opusul lui 0001 5 (1 10 ) este 4444 5 (−1 10 ).
Dacă citiți date dintr-un fișier sau o zonă de memorie în care sunt stocate în completarea a doi (de exemplu, un fișier WAVE), poate fi necesar să convertiți octeții. Dacă datele sunt stocate pe 8 biți, valorile 128-255 trebuie să fie negative.
Extensie de semn (ing. Extensie de semn ) - o operație pe un număr binar care vă permite să creșteți numărul de biți, păstrând în același timp semnul și valoarea. Se realizează prin adăugarea cifrelor din cifra cea mai semnificativă. Dacă numărul este pozitiv (cea mai semnificativă cifră este 0), atunci se adaugă zerouri; dacă este negativ (cea mai semnificativă cifră este 1), se adaugă unele.
Numar decimal | număr binar
(8 cifre) |
număr binar
(16 cifre) |
---|---|---|
zece | 0000 1010 | 0000 0000 0000 1010 |
−15 | 1111 0001 | 1111 1111 1111 0001 |