Complement față de doi

De la Wikipedia, enciclopedia liberă
Salt la: Navigare, căutare

Complementul față de doi (sau codul complementar) este o metodă de reprezentare binară a numerelor întregi în calculator în virgulă fixă. Această metodă simplifică efectuarea operațiilor de adunare și scădere a numerelor întregi comparativ cu reprezentarea în cod direct. Comparativ cu reprezentarea în complement față de unu, permite operarea cu toate cele 2^n numere reprezentabile pe n biți, existând o unică reprezentare pentru 0.

Reprezentarea numerelor în cod complementar[modificare | modificare sursă]

În complementul față de doi, din gama de 2^n numere reprezentabile pe n biți, se pot reprezenta 2^{n-1} (de la -2^{n-1} până la -1) numere negative, 0 și 2^{n-1}-1 (de la 1 la 2^{n-1} - 1) numere pozitive.[1] Ca și în alte metode de reprezentare în virgulă fixă, cum sunt codul direct și complementul față de unu, bitul cel mai semnificativ este folosit pentru reprezentarea semnului numărului, 0 reprezentând semnul +, iar 1 reprezentând semnul -. Acest bit se numește bit de semn. Ceilalți n-1 biți au semnificație diferită pentru numerele pozitive și cele negative.

Complement față de doi Zecimal
0111 7
0110 6
0101 5
0100 4
0011 3
0010 2
0001 1
0000 0
1111 −1
1110 −2
1101 −3
1100 −4
1011 −5
1010 −6
1001 −7
1000 −8

Reprezentarea numerelor pe 4 biți în complement față de doi

Numerele pozitive[modificare | modificare sursă]

La reprezentarea numerelor întregi pozitive, pe cei n-1 biți se trece reprezentarea în bază doi a valorii absolute a numărului. Astfel, reprezentarea pe 4 biți a numărului zecimal 3 este 0011, primul 0 fiind bitul de semn, iar 011 fiind reprezentarea binară a numărului 3.

Numerele negative[modificare | modificare sursă]

Matematic, reprezentarea unui număr negativ în complement față de doi este valoarea 2^n - V, unde V este valoarea absolută a numărului reprezentat. De exemplu, numărul -9 se reprezintă pe 8 biți astfel: se calculează valoarea absolută a numărului, care este 9, reprezentată binar pe 8 biți este 00001001.

100000000-
 00001001=
---------
 11110111

Altfel, pentru a obține reprezentarea în complement față de doi un număr negativ, se ia reprezentarea valorii absolute a acestuia, se inversează bit cu bit (inclusiv bitul de semn) și apoi se adună 1 la rezultat. Luând același exemplu, avem:

00001001
--------
11110110+ (inversat)
       1
--------
11110111

Se observă astfel că valoarea 11111111 reprezintă numărul -1 = - \left[ 2^8- \left(2^8-1\right) \right], spre deosebire de complementul față de unu, unde aceeași valoare era o reprezentare alternativă pentru numărul 0. Toate valorile negative sunt astfel deplasate cu 1 în raport cu complementul față de unu. Se elimină astfel o ambiguitate și se lărgește puțin domeniul de reprezentare.

Algebra complementului față de doi[modificare | modificare sursă]

Cele 2^n numere reprezentabile pe n biți formează inelul claselor de echivalență a resturilor modulo 2^n. Fără bit de semn, acestea pot reprezenta numerele de la 0 la 2^n - 1. Însă, întrucât în aceste clase de resturi fiecare număr este echivalent cu el însuși minus 2^n, ele pot reprezenta la fel de bine și numerele de la -2^{n-1} până la 2^{n-1}-1.

Adunarea și scăderea în complement față de doi[modificare | modificare sursă]

Cum conversia unui număr în complementul său este o operație simplă, scăderea numerelor în această metodă de reprezentare se reduce la adunarea descăzutului la complementul față de doi al scăzătorului. Adunarea se face bit cu bit, incluzând aici și bitul de semn, iar eventualul transport rezultat din adunarea biților de semn se neglijează. [2]

Detecția depășirilor[modificare | modificare sursă]

Depășirile apar atunci când rezultatul adunării sau scăderii este mai mare decât valoarea maximă (caz în care se numește overflow) sau mai mic decât valoarea minimă (caz în care se numește underflow) reprezentabilă pe n biți. Deoarece în caz de depășire rezultatul operației este unul eronat, este important ca unitatea aritmetică și logică să poată detecta această condiție de eroare. Aceasta se poate face urmărind transportul la momentul adunării bitului de semn. Dacă la adunarea bitului de semn se generează un transport diferit de cel de la bitul imediat următor, atunci se știe că a avut loc depășirea.

Note[modificare | modificare sursă]

  1. ^ Diatcu (1997), p. 82
  2. ^ Diatcu (1997), p. 84

Bibliografie[modificare | modificare sursă]

  • Datcu E. (1997). Elemente fundamentale ale teoriei sistemelor și calculatoarelor. Tertișco A., Iacob F., Tache M., Racoviță Z.. București: Editura Hyperion