Sunteți pe pagina 1din 7

Laborator 1 /////////////////////////////////////////////////////////////// Despre reprezentarea datelor.

Codificare si aritmetica binara ///////////////////////////////////////////////////////////////

__ Cuvinte cheie __ bit, cuvint, octet, reprezentare cu semn, cod complementar, extindere cu semn, depasire, codificare, cod ASCII Sistemul de numere cu care suntem obisnuiti este sistemul in baza 10. Un calculator insa, trateaza informatie binara, adica numere scrise in baza 2, formate doar din cifrele 0 si 1, numite BITi (BInary digiT - cifra binara). Cele doua cifre, 0 si 1, corespund starilor "on " si "off " ale unui switch electronic. In mod natural, oricarui utilizator ii este mult mai usor sa citeasca informatie exprimata in caractere alfanumerice (litere, numere, semne de punctuatie). De aceea se pune problema introducerii unei corespondente intre reprezentarea alfanumerica (convenabila unui om) si reprezentarea binara necesara unui calculator pentru reprezentarea interna a datelor (fie acestea numere sau caractere). In aceasta idee, mai multe sisteme si scheme de codificare au fost folosite. Noi vom discuta unitatile de baza folosite de un microprocesor pentru reprezentarea datelor (bit, octet, cuvint), vom invata sa manevram aceste unitati, apoi vom examina unul din cele mai folosite sisteme de codificare a caracterelor alfanumerice, numit ASCII.

____ Sisteme numerice ____ In general, orice intreg pozitiv N descris intr-o baza B ca un sir de cifre in acea baza (in multimea {0, ... , B-1}) in forma A(n)A(n-1)...A(1)A(0) se poate exprima conform formulei: N = A(n)*B^(n) + A(n-1)*B^(n-1) + ... + A(1)*B + A(0) (simbolul "*" este folosit pentru inmultire, iar notatia B^(i) inseamna B la puterea i) In baza 2, evident, orice intreg pozitiv va fi exprimat astfel:

N = A(n)*2^(n) + A(n-1)*2^(n-1) + ... + A(1)*2 + A(0) unde A(i), i in {0, 1, ..., n} sunt 0 sau 1. De exemplu, numarul 53 (in baza 10) este exprimat in baza 2 ca 110101. Conversia unui numar din baza 2 in baza 10 se face usor, iar pentru exemplul nostru, conform a ce urmeaza: 110101 (baza 2) = 1*2^5 + 1*2^4 + 0*2^3 + 1*2^2 + 0*2 + 1 = = 32 + 16 + 0 + 4 + 0 + 1 = = 53. Evident, numerele binare pot fi adunate, scazute, inmultite, impartite fara a fi nevoie de o conversie in baza 10. De exemplu: 1001+ 101 ----1110 reprezentarea binara a lui 9 reprezentarea binara a lui 5 reprezentarea binara a lui 14

Iata tabelele operatiilor de adunare si inmultire in baza 2: + | 0 | 1 | -----------0 | 0 | 1 | -----------1 | 1 | 10| -----------* | 0 | 1 | -----------0 | 0 | 0 | -----------1 | 0 | 1 | ------------

Exista o alta baza frecvent folosita in informatica, anume baza 16. Aceasta pentru ca ea permite scrierea condensata a secventelor lungi de biti (care pot provoca erori sau confuzii). Acest sistem numeric, numit hexazecimal, necesita 16 cifre distincte, 0, 1..., 9, la care sunt adaugate literele A, B, C, D, E si F, corespunzind numerelor 10, 11, 12, 13, 14, 15 (in baza 10) respectiv. Asadar, C2 (baza 16) = C*16^1 + 2*16^0 = 194 (baza 10) In cele ce urmeaza, pentru a evita confuzia, numerele hexazecimale vor fi urmate de litera "h" iar cele binare, de "b". De exemplu: C2 h = 1100 0010 b = 194 Practic, scrierea in baza 16 permite gruparea bitilor cite 4, fiecare grup de patru fiind reprezentat de un singur caracter. Conversia intre cele doua baze, 16 si 2, se face extrem de usor; sa luam ultimul exemplu: cifra Ch este 1100b, iar 2h este 0010b; C2h se obtine prin alaturarea celor doua grupuri de 4, deci 1100 0010b. Un calculator manipuleaza secvente de biti de o lungime data (8, 16, 32,... biti), functie de posibilitatea sa de a trata SIMULTAN 8, 16, 32,... biti. Aceste numere se numesc cuvinte. Microprocesoarele din familia 8086, de exemplu, manipuleaza cuvinte de 16 biti, o secventa de 8 biti fiind numita octet ("byte" in engleza). Iata cum este reprezentat

numarul zecimal 57 (39h, 0011 1001b) intr-un octet: 7 6 5 4 3 2 1 0 ___ ___ ___ ___ ___ ___ ___ ___ | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | |___|___|___|___|___|___|___|___| | | | | | | | | | | | | | | | ------> | | | | | | | | | | | | | ----------> | | | | | | | | | | | --------------> | | | | | | | | | ------------------> | | | | | | | ----------------------> | | | | | --------------------------> | | | ------------------------------> | ---------------------------------->

1 * 1 0 * 2 0 * 4 1 * 8 1 * 16 1 * 32 0 * 64 0 *128 -------57

Presupunind acum ca un calculator trateaza cuvinte de n biti, cu n intreg pozitiv, se pune intrebarea: cite configuratii posibile (adica numere formate din 0 si 1) pot fi reprezentate pe n biti? Pentru n=1, exista doua configuratii posibile: ___ ___ | 0 | si | 1 | ----Pentru n=2, exista 4 configuratii posibile: ___ ___ | 0 | 0 | , --- --___ ___ | 0 | 1 | , --- --___ ___ | 1 | 0 | si --- --___ ___ | 1 | 1 | --- --etc. Se poate arata usor ca numarul de configuratii posibile reprezentabile pe n biti este 2 la puterea n. Asadar, un octet va permite reprezentarea a 2 la puterea 8 (deci 256) configuratii diferite, iar un cuvint pe 16 biti - 2 la puterea 16 (deci 65536) configuratii diferite. De ce intereseaza acest numar? De exemplu pentru a sti care este domeniul numerelor intregi pozitive reprezentabile pe un octet, pe doi octeti, pe un cuvint, s.a.m.d. Notatia binara este perfecta pentru descrierea numerelor pozitive; in cazul in care sunt necesare numere negative, avem nevoie de un

mecanism suplimentar pentru a indica semnul. Cel mai simplu mod de a face aceasta este de a folosi (in cadrul unui octet) cel mai semnificativ bit (cel din extrema stinga) in acest scop. In reprezentarea cu semn, daca acest bit este 0 numarul este pozitiv iar daca este 1, numarul este negativ. Conform acestor afirmatii, avem 0000 0100 b 1000 0100 b = = +4 -4

Totusi aceasta reprezentare are un dezavantaj. De exemplu, daca am incerca sa adunam numerele de mai sus, rezultatul nu ar fi 0 ci -8 (in reprezentarea cu semn); ori daca scadem 1 din 0, rezultatul va fi 1111 1111b (-127) si nu 1000 0001b. Altfel spus, ar trebui modificate regulile aritmetice. Daca vrem sa folosim aceeasi aritmetica binara pentru numere cu semn ca si pentru cele fara semn, avem nevoie de o reprezentare in care 1111 1111b sa reprezinte -1 si nu -127. Deci ar trebui sa reprezentam numerele dupa cum urmeaza: ... 0000 0000 0000 0000 1111 1111 1111 ... Aceasta reprezentare se numeste reprezentare in cod complementar si are proprietatea ca adunarile si scaderile vor da rezultat corect in cod complementar, iar bitul cel mai semnificativ este bit semn. Semnul unui numar in cod complementar poate fi schimbat prin adunarea cu 1 la numarul obtinut din cel initial prin modificarea valorii fiecarui bit. De exemplu, -3 poate fi obtinut din 3 astfel: 0000 0011b ---------1111 1100b+ 0000 0001b ---------1111 1101b +3 in cod complementar +3 cu fiecare bit modificat +1 in cod complementar -3 in cod complementar 0011 0010 0001 0000 1111 1110 1101 b b b b b b b +3 +2 +1 0 -1 -2 -3

Trebuie retinuta inca o observatie despre numerele in cod complementar: daca un numar reprezentat pe un octet trebuie extins la 16 biti (de pilda ca sa poata fi adunat cu un numar in cod complementar pe 16 biti) este necesara o mica precautie in legatura cu cei 8 biti suplimentari. In cazul numerelor pozitive lucrurile stau simplu; daca vrem sa adunam 0000 0001b la 0000 0000 0000 0011b, vom adauga 8 de 0 la stinga lui +1 iar adunarea va da rezultatul corect. Totusi daca vrem sa adunam FFh (-1) la 0003h, pentru ca rezultatul sa fie corect, trebuie sa adaugam 8 de 1 la stinga lui -1, altfel numarul s-ar transforma intr-unul negativ. Regula este asadar evidenta: extinderea unui numar in cod complementar se face prin adaugarea unor biti suplimentari cu aceeasi valoare ca ai bitului semn. Acest procedeu se numeste extindere cu semn. Sa presupunem ca lucram pe un calculator imaginar care poate reprezenta numere intregi pe un octet. Asadar, domeniul numerelor

intregi cu care se pot face calcule este 0 ... 255 pentru numere intregi pozitive si -128 ... +127 pentru numere cu semn. In contextul in care rezultatul unei operatii poate iesi in afara domeniului dat, trebuie fixata notiunea de depasire. De exemplu, adunind 7 cu 125 (considerate ca numere cu semn), rezultatul va fi irelevant (rezultat negativ la adunarea a doua numere pozitive). 0000 0111b+ 0111 1101b ----------1000 0100b Pentru a controla situatiile de acest gen, de obicei exista niste indicatori specializati care semnaleaza depasiri in cadrul instructiunilor aritmetice. De altfel, asupra acestei chestiuni vom reveni in laboratoarele viitoare. Ce trebuie sa retinem de aici este notiunea de depasire si faptul ca ea poate (si este indicat a) fi detectata.

__ Codificare __ Pentru a introduce notiunea de codificare a datelor, sa consideram un exemplu foarte simplu. Sa presupunem ca o anumita problema pe care dorim sa o rezolvam necesita folosirea a cinci culori: negru, alb, albastru, rosu si verde. Sa mai presupunem ca implementam o solutie pentru problema in cauza pe un calculator imaginar care manipuleaza cuvinte de 3 biti. Un exemplu de codificare al culorilor ar putea fi: albastru rosu alb negru verde 000 001 010 011 100

Sa observam ca am folosit doar 5 configuratii binare din cele 8 posibile. Practic, o asemenea codificare este doar o conventie care are sens pentru noi, cei care o stabilim. Fiind data o multime de obiecte care trebuiesc tratate si multimea configuratiilor binare reprezentabile pe un cuvint de n biti, codificarea este stabilirea unei functii injective intre multimea obiectelor de tratat si multimea configuratiilor binare. Anumite obiecte frecvent utilizate au nevoie de codificare. Este tocmai cazul caracterelor alfanumerice (litere, cifre, semne de punctuatie, caractere speciale), pentru care se cunosc mai multe sisteme de codificare utilizate: BCD (Binary Coded Decimal), EBCDIC (Extended Binary Coded Decimal Interchange Code) si ASCII (American Standard Code for Information Interchange). Ne vom opri putin asupra sistemului de codificare ASCII. Ca un minim, avem nevoie sa putem reprezenta 26 litere si 10 cifre, deci 36 caractere. Dar ne-ar place, de asemenea, sa putem distinge intre literele mari si cele mici (alte 26 caractere) si sa putem reprezenta citeva caractere speciale (+, =, *, %, {, }, [, ], etc.). In concluzie avem macar 64 de caractere, deci avem nevoie de 7 biti pentru a le reprezenta (pe 6 biti putem reprezenta 64 configuratii, de la 0

la 63). Codificarea ASCII foloseste 7 biti pentru caractere, de fapt un octet, un bit fiind folosit pentru detectarea erorilor. Iata citeva exemple de caractere, cu codurile ASCII atasate: A B ... Z ... 0 1 ... ( ) ... 0100 0001 0100 0010 0101 1100 0011 0000 0011 0001 0010 1000 0010 1001

Accentuam urmatorul aspect: codificarea CARACTERULUI 1 de exemplu (31h, 49 in baza 10, conform listei de mai sus), nu are nici o legatura cu reprezentarea interna a NUMARULUI 1 (01h). Inainte de a incheia, sa mai subliniem un lucru: ceea ce cititi dv. acum este un fisier text, adica unul care contine caractere alfanumerice. Orice fisier, ca forma de inmagazinare si organizare a datelor pe un dispozitiv de stocare extern (hard-disk, disc floppy), este un sir de 0 si 1. Este treaba calculatorului sa citeasca datele din fisier, sa le "decodifice" conform codului ASCII si sa afiseze pe ecran caracterele cu care sunteti familiarizati. Exista fisiere care nu contin un text, de exemplu fisierele executabile. Mediul de programare Turbo Pascal de care va folositi ca sa cititi, eventual sa modificati continutul acestui fisier, este pe hard-disk sub forma de fisier, cu numele "turbo.exe". El este un program care contine, printre altele, descrierea instructiunilor (in 0 si 1) pe care, la lansarea sa in executie, masina trebuie sa le execute, una dupa alta. Desigur, pentru descrierea acestor instructiuni in 0 si 1, exista de asemenea un mecanism de codificare. Incercati sa vedeti un asemenea fisier. Este indoielnic ca va va comunica ceva. INTREBARI SI EXERCITII: 1. Convertiti din baza 2 in baza 10 secventa 1100 0011b. Considerati ambele cazuri, numar cu semn si numar fara semn in reprezentarea cu semn si in cea in cod complementar. 2. Imaginati o metoda de conversie din baza 10 in baza 2 si demonstrati matematic corectitudinea ei. (indicatie: folositi teorema impartirii cu rest) 3. Construiti o tabela cu trei coloane: in prima completati cu cifrele bazei 16, in a doua cu numerele corespondente reprezentate in baza 2, iar in ultima cu numerele corespunzatoare in baza 10. 4. Utilizind tabela mentionata in intrebarea precedenta, convertiti in baza doi numerele FFh, A4h, 8Bh, 23h. 5. Utilizind aceeasi tabela, convertiti in baza 16 numerele 10101110b, 00111010b, 11011000b. 6. Aratati ca numarul de configuratii posibile reprezentabile pe n biti este 2 la puterea n.

7. Schimbati semnul urmatoarelor numere, in cod complementar: 0100 1100b, 1101 0100b, 0111 1111b specificind corespondentele lor in baza 10. 8. Efectuati urmatoarele operatii in cod complementar: 24h + A8h, FEh + 997Bh, FD45h-20h. 9. Presupunind ca puteti reprezenta numere intregi pozitive pe numai un octet, in care din cazurile urmatoare obtineti depasire? 09h + 7Ch, 07h + F9h, 87h + F5h. 10. Presupunind ca puteti reprezenta numere intregi in cod complementar pe numai un octet, in care din cazurile urmatoare obtineti depasire? A6h + F1h, 16h + 7Ch, 64h - FFh. 11. Fiind data o codificare in care toate caracterele reprezentind cifre se afla in pozitii consecutive (si asa este in codificarea ASCII) si ca lui 0 ca si caracter ii corespunde codul 30h, stabiliti o formula cu ajutorul careia sa puneti in corespondenta caracterele exprimind cifrele sistemului zecimal cu valorile lor numerice (in baza 10). 12. In aceleasi conditii ca in problema precedenta, stabiliti o formula cu ajutorul careia sa convertiti un sir de caractere exprimind un numar la valoarea sa numerica, in baza 10. 13. Cite cifre 1 sunt in reprezentarea binara a numarului zecimal 512 + 64 + 16 + 8 + 1 ? 14. Cite cifre 1 sunt in reprezentarea binara a numarului zecimal 9 * 256 + 3 * 16 + 1 ? 15. Scrieti formula de calcul pentru transformarea din codul ASCII corespunzator unei litere mici in codul ASCII corespunzator literei mari, stiind ca literele mari se afla inaintea literelor mici, pe pozitii consecutive. Sunt suficiente datele primite pentru a raspunde? 16. Daca ar trebui codificata o multime de 108 simboluri, pe citi biti va trebui sa facem reprezentarea codului unui simbol ? 17. Cite cifre semnificative (fara cifre 0 la stinga) are reprezentarea binara a valorii 2^3? Dar valoarea 2^9? Generalizati pentru 2^n. 18. Presupunind ca aveti nevoie sa lucrati in sistemul numeric in baza 8, cu cifre in multimea {0, 1, 2, ... , 7} (numit octal), construiti tabelele operatiilor de adunare si inmultire. Efectuati urmatoarele conversii din sistemul octal in sistemul zecimal: 32o + 62o +12o, 17o+45o, 56o - 34o.

S-ar putea să vă placă și