Reprezentarea numerelor in calculator

Generalitati

Intr-o prima aproximatie, memoria calculatorului o putem vedea ca un sir de celule (biti), fiecare celula putand contine la un moment dat un 0 sau un 1 (in particular, nu poate fi goala).

Pentru ca o informatie aflata in memorie sa fie utilizabila, trebuie sa stim unde anume se afla (la ce adresa). Cel mai simplu este ca fiecare informatie sa fie la o adresa fixa (fixata in momentul scrierii programului). Asta inseamna ca si dimensiunea disponibila pentru reprezentarea acelei informatii se fixeaza la scrierea programului.

In reprezentarea numerelor de obicei fixam de la inceput numarul n de biti pe care se face reprezentarea; prin urmare reprezentarea oricarui numar va fi un sir de n cifre 0 sau 1. Faptul ca n este fixat a priori face ca sa nu putem reprezenta orice numar intreg, ci doar numerele dintr-un anumit interval, fixat o data cu alegerea lui n.

Reprezentarea numerelor intregi pozitive

Cea mai naturala reprezentare a numerelor intregi pozitive este scrierea pozitionala in baza 2.

De exemplu, numarul 20 se reprezinta pe 8 biti ca 00010100.

Cel mai mare numar reprezentabil pe 8 biti este 11111111, adica 255. In general, cel mai mare numar reprezentabil pe n biti este 2^n-1. Cel mai mic numar reprezentabil in acest fel, indiferent de numarul de biti ales, este 0.

Exercitiu

Justificati intervalul maxim de reprezentare in baza 2 pe n biti.

Aritmetica cu numere reprezentate in baza 2

Aritmetica pentru numere reprezentate in baza 2 se face intocmai ca in baza 10, dar cu tabla adunarii adecvata. De notat ca noi nu stim sa adunam direct doua numere; stim doar sa aplicam algoritmul de adunare asupra reprezentarilor lor, de obicei in baza 10. Pentru a va convinge, incercati sa adunati direct numere reprezentate in scriere romana (ex LIV+XIX).

Exemple:

20 = 00010100 + 144 = 10010000 +
 7 = 00000111 116 = 01110100
       ---------- ----------
        00011011 00000100
De notat ca in exemplul al doilea am avut un transport 1 de la rangul cel mai semnificativ. Aceasta deoarece rezultatul corect al adunarii (260) nu este reprezentabil pe 8 biti, iar rezultatul obtinut este 4 (incorect).

In general, urmatoarele afirmatii sunt echivalente:

Conversii de lungime

Pentru a aduna (sau scadea) doua numere reprezentate in baza 2, trebuie sa dispunem de rprezentari pe lungimi egale. In caz contrar, trebuie sa aplicam conversii de lungime asupra unuia sau ambelor numere.

Trecerea de la o reprezentare pe mai putini biti la reprezentare pe mai multi biti se face adaugand cifre 0 in fata. Trecerea de pe mai multi biti pe mai putini se face ignorand bitii mai semnificativi.

Exercitiu

In ce conditii conversiile de lungime sunt corecte (rezultatul este o reprezentare a aceluiasi numar ca si cel de plecare) ?

Reprezentarea numerelor intregi (posibil negative)

Cel mai simplu este sa folosim un bit pentru reprezentarea semnului (de ex., 0 inseamna plus si 1 inseamna minus) si ceilalti (n-1) biti pentru reprezentarea valorii absolute.

Reprezentarea folosita de obicei in calculatoare este insa alta, si anume asa-numita reprezentare in complement fata de 2 sau cod complementar:

Numerele pozitive se reprezinta ca si in baza 2; primul bit trebuie sa fie 0, motiv pentru care cel mai mare numar reprezentabil este 2^(n-1).

Numerele negative se reprezinta astfel: plecam de la reprezentarea in baza 2 a opusului (care este pozitiv), dupa care inversam toate cifrele pana la ultimul 1 (exclusiv). Astfel (tot pe 8 biti), -20 se reprezinta ca 11101100. Cel mai mic numar reprezentabil este -2^n (care are reprezentarea un 1 urmat de n-1 zerouri.

Primul bit se mai numeste bit de semn deoarece el indica semnul numarului (este 0 daca si numai daca numarul este pozitiv).

Avantajul acestei reprezentari este urmatorul: Algoritmii de adunare si de scadere a doua numere reprezentate in cod complementar sunt identici cu algoritmii de adunare si de scadere pentru numere pozitive reprezentate in baza 2.

Exemple:

 22 = 00010110
-22 = 11101010
 18 = 00010010 + -22 = 11101010 +
-22 = 11101010 50 = 00110010
      ---------- ----------
       11111100 00011100

Si in cazul sumei sau diferentei a doua numere reprezentate in cod complementar, rezultatul este corect daca si numai daca rezultatul corect este reprezentabil pe lungimea aleasa. Testul de depasire este insa putin diferit: la adunare avem depasire daca si numai daca transportul de la pozitia 2 spre pozitia 1 este diferit de transportul de la pozitia 1 (si ignorat).

Exercitii

1. Demonstrati corectitudinea aritmeticii in cod complementar. Indicatie: reprezentarea in cod complementar a numarului negativ a coincide cu reprezentarea, ca numar pozitiv, in baza 2 a numarului 2^n+a.

2. Justificati criteriul dat mai sus pentru depasire la adunare.

3. Gasiti un criteriu similar pentru scadere.

Conversii de lungime pentru cod complementar

Trecerea de la lungime mai mica la lungime mai mare se face completand pozitiile din fata cu copii ale bitului de semn. Trecerea de la lungime mai mare la lungime mai mica se face ignorand cifrele cele mai semnificative. De exemplu, -7 se reprezinta pe 4 biti ca 1001 La trecerea pe 6 biti obtinem 11111001.

Exercitiu

Stabiliti in ce conditii conversiile de lungime date mai sus sunt corecte.


Arhitectura Calculatoarelor

9 Oct 2001
Radu-Lucian LUPSA