Cod suplimentar

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 31 ianuarie 2021; verificările necesită 22 de modificări .

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).

Reprezentarea în complement a doi a unui număr negativ

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       

Cod suplimentar într-un sistem de numere diferit

Același principiu poate fi folosit și în reprezentarea computerizată a oricărui sistem numeric , cum ar fi pentru numerele zecimale .

Transformări pe exemplul sistemului numeric zecimal [1]

Număr pozitiv

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 negativ

Adă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:

  1. Atribuiți variabilei x o nouă valoare egală cu expresia 9 - x (procesul de obținere a codului invers) - de exemplu, un număr negativ [ -12345 ] în codul direct de la cea mai semnificativă la cea mai puțin semnificativă cifră va arăta ca [9' 12345 ], unde 9 este o cifră semn, iar în reprezentarea inversă a codului va arăta astfel - [9'87654].
  2. Adăugăm 1 la numărul rezultat, astfel încât numărul [9'87654] (prima adăugare) va arăta ca [987'655] (cod suplimentar).
  3. Dacă a apărut o situație de transfer de biți, în urma căreia s-a format un nou bit, atunci îl omitem (bitul cel mai înalt) și considerăm că numărul rezultat este pozitiv. Numărul pozitiv rezultat va fi reprezentat în mod egal, atât în ​​codul direct cât și în complementul a doi. De exemplu, având capacitatea de a reprezenta zero negativ și pozitiv în această formă, să analizăm traducerea lor într-un cod suplimentar (1 semn și 4 cifre suplimentare):
    • [+0] în cod direct [0'0000]. Primul și al doilea complement sunt [0'0000].
    • [-0] în cod direct [9'0000]. Prima adăugare este [9'9999]. La primirea celui de-al doilea complement, bitul înalt al numărului [(1)0'0000] este omis și se obține valoarea rezultată [0'0000], ca în numărul [+0].

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

Aritmetica complementului a doi

Adunarea și scăderea

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:

  • [1234] + [-78] → [0'1234] + [9'9922] = [(1)0'1156] = [1156].
  • [-1234] + [78] → [9'8766] + [0'0078] = [9'8844] = [-1156].

Semnele sunt aceleași:

  • numere pozitive. Descărcarea nu cade, rezultatul este pozitiv.
  • Numerele negative. Cifra este omisă, rezultatul este negativ în codul complementului a doi.

De exemplu:

  • [1234] + [78] → [0'1234] + [0'0078] = [0'1312] = [1312].
  • [-1234] + [-78] → [9'8766] + [9'9922] = [(1)9'8688] → (primul complement) [0'1311] → (al doilea complement sau reprezentare regulată) [0 '1312]. Când este translată din complementul a doi la reprezentarea normală, valoarea rezultată este absolută.

Conversia la complementul a doi

Conversia unui număr dintr-un cod direct într-unul suplimentar se realizează conform următorului algoritm.

  1. Dacă cel mai semnificativ (semn) bit al numărului scris în codul direct este 0, atunci numărul este pozitiv și nu se fac transformări;
  2. Dacă cea mai semnificativă cifră (semn) a numărului scris în codul direct este 1, atunci numărul este negativ, toate cifrele numărului, cu excepția semnului, sunt inversate și 1 se adaugă la rezultat.

Exemplu. Să convertim numărul negativ −5, scris în codul direct, într-un cod suplimentar. Cod direct pentru un număr negativ -5:

1000 0101

Inversăm toate cifrele numărului, cu excepția semnului, obținând astfel codul invers (prima adunare) a unui număr negativ -5:

1111 1010

Să adăugăm 1 la rezultat, obținând astfel codul suplimentar (complement al doilea) al numărului negativ -5:

1111 1011

Un 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 1011

Inversăm toate cifrele numărului negativ -5, obținând astfel un număr pozitiv 4 în cod direct:

0000 0100

Adă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.

numere p-adice

Î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 ).

Implementarea algoritmului de conversie a complementului doi (pentru numere de 8 biți)

Pascal

dacă ( a < 0 ) atunci a := (( nu a ) sau 128 ) + 1 ;

C/C++

int convert ( int a ) { dacă ( a < 0 ) a = ~ ( - a ) + 1 ; returnează un ; }

Avantaje și dezavantaje

Beneficii

  • Instrucțiuni generale (procesor) pentru adunare, scădere și deplasare la stânga pentru numerele cu semn și fără semn (diferențe numai în steaguri aritmetice care trebuie verificate pentru a controla depășirea în rezultat).
  • Absența numărului „ minus zero ”.

Dezavantaje

  • Reprezentarea unui număr negativ nu este citită vizual conform regulilor obișnuite; percepția lui necesită o abilitate specială sau calcule suplimentare pentru a-l aduce într-o formă normală.
  • În unele reprezentări (cum ar fi BCD ) sau părțile lor componente (cum ar fi mantisa unui număr în virgulă mobilă ), codificarea suplimentară este incomodă.
  • Modulul celui mai mare număr nu este egal cu modulul celui mai mic număr. De exemplu, pentru un număr întreg cu semn de opt biți, numărul maxim este 127 10 = 01111111 2 , numărul minim este -128 10 = 10000000 2 . Prin urmare, nu pentru orice număr există un opus. Operațiunea de schimbare a semnului poate necesita o verificare suplimentară.

Exemplu de conversie programatică

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.

Stil C# .NET / C

octet b1 = 254 ; //11111110 (binar) octet b2 = 121 ; //01111001 (binar) octet c = 1 <<( sizeof ( byte )* 8 - 1 ); //2 este ridicat la puterea lui 7. Rezultat: 10000000 (binar) octet b1Conversion =( c ^ b1 ) - c ; //Rezultat: -2. Și de fapt, un cod de complement binar în doi. octet b2Conversion =( c ^ b2 ) - c ; //Rezultatul rămâne 121 deoarece bitul de semn este zero.

Extensie semnă

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.

Exemplu

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

Vezi și

Literatură

  • Behrooz Parhami. 2.3. Reprezentarea complementului, 2.4. Numerele de completare la doi și la 1 // Aritmetică computerizată: algoritmi și design hardware . - New York: Oxford University Press, 2000. - P. 22-27. — 510p. — ISBN 0-19-512583-5 .
  • Samofalov K.G., Romankevich A.M., Valuysky V.N., Kanevsky Yu.S., Pinevich M.M. Teoria aplicată a automatelor digitale. - K . : Şcoala Vishcha, 1987. - 375 p.

Link -uri

  1. Florida Tech . Preluat la 28 noiembrie 2020. Arhivat din original la 8 octombrie 2016.