Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa...

25
1 Chiculiţă, v.2011-03-02 1 Reprezentarea interna a informaţiei 1.1 Baze de numeraţie Se numeşte sistem de numeraţie o mulţime de simboluri (sau cifre) si de reguli, utilizate pentru reprezentarea unui număr. Se numeşte reprezentare in baza p, pN*, p>1 a numărului întreg N succesiunea de cifre x m ,x m-1 , ... x 1 ,x 0 unde x i verifica relaţiile: a) 0x i p-1, ()i=1,m x m 0 b) N = x m p m + x m-1 p m-1 + ... + x 1 p 1 + x 0 aceasta reprezentare fiind unica. Fie numărul N (p) un număr întreg reprezentat in baza p. Pentru a obţine echivalentul lui in baza q, notat N (q) va trebui obţinuta o reprezentare: y m ,y m-1 , ... y 1 ,y 0 unde y i [0,q-1], ()i=1,m; y m 0 si N (q) = y m p m + y m-1 p m-1 + ... + y 1 p 1 + y 0 . Pentru aceasta se împarte numărul N (p) la q si apoi succesiv caturile obţinute, pana se obţine catul 0. Cifrele reprezentării in baza q a numărului N (p) sunt resturile împărţirii succesive luate in ordinea inversa a obţinerii lor. 1.1.1 Baze de numeraţie in istorie Mulţi dintre studenţii care intra prima data in contact cu alte baze de numeraţie (altele decât baza 10) au impresia ca acestea sunt extraterestre. Pentru a risipi aceasta părere, sunt enumerate câteva baze de numeraţie folosite de diverse civilizaţii de-a lungul timpului. Mayasii foloseau baza 20. Figura 1-1: "Cifrele" bazei 20 la mayasi şi exemple Obs.: Acesta era un sistem de numeraţie poziţional (contează poziţia pe care se afla unul din cele 20 de simboluri); poziţiile erau considerate de jos în sus, ca în Figura 1-1b (5125=12*400+16*20+5). Babilonienii foloseau baza 60 in calcule, de aici este moştenită si împărţirea in 60 a orelor si minutelor si împărţirea in 360 de grade a cercului. Tabelul 1-1: "Cifrele" bazei 60 la babilonieni

Transcript of Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa...

Page 1: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

1 Chiculiţă, v.2011-03-02

1 Reprezentarea interna a informaţiei

1.1 Baze de numeraţie

Se numeşte sistem de numeraţie o mulţime de simboluri (sau cifre) si de reguli, utilizate

pentru reprezentarea unui număr.

Se numeşte reprezentare in baza p, pN*, p>1 a numărului întreg N succesiunea de cifre

xm,xm-1, ... x1,x0 unde xi verifica relaţiile:

a) 0xip-1, ()i=1,m xm0

b) N = xmpm

+ xm-1pm-1

+ ... + x1p1

+ x0 aceasta reprezentare fiind unica.

Fie numărul N(p) un număr întreg reprezentat in baza p. Pentru a obţine echivalentul lui in

baza q, notat N(q) va trebui obţinuta o reprezentare: ym,ym-1, ... y1,y0 unde yi[0,q-1],

()i=1,m; ym0 si N(q) = ympm

+ ym-1pm-1

+ ... + y1p1

+ y0. Pentru aceasta se împarte

numărul N(p) la q si apoi succesiv caturile obţinute, pana se obţine catul 0. Cifrele

reprezentării in baza q a numărului N(p) sunt resturile împărţirii succesive luate in ordinea

inversa a obţinerii lor.

1.1.1 Baze de numeraţie in istorie

Mulţi dintre studenţii care intra prima data in contact cu alte baze de numeraţie (altele

decât baza 10) au impresia ca acestea sunt extraterestre. Pentru a risipi aceasta părere,

sunt enumerate câteva baze de numeraţie folosite de diverse civilizaţii de-a lungul

timpului.

Mayasii foloseau baza 20.

Figura 1-1: "Cifrele" bazei 20 la mayasi şi exemple

Obs.: Acesta era un sistem de numeraţie poziţional (contează poziţia pe care se afla unul

din cele 20 de simboluri); poziţiile erau considerate de jos în sus, ca în Figura 1-1b

(5125=12*400+16*20+5).

Babilonienii foloseau baza 60 in calcule, de aici este moştenită si împărţirea in 60 a orelor

si minutelor si împărţirea in 360 de grade a cercului.

Tabelul 1-1: "Cifrele" bazei 60 la babilonieni

Page 2: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

2 Chiculiţă, v.2011-03-02

Obs.: Sistemul de numeraţie era poziţional, unităţile fiind cele mai din dreapta, ca în baza

10. Exemplu: 424000= 1*603 + 57 *60

2 + 46*60 + 40

Egiptenii foloseau baza 10, folosind insa cate un simbol separat (hieroglifa) pentru

zeci,sute, mii, etc.

Tabelul 1-2: Simbolurile egiptene pentru puteri ale lui 10: linie, genunchi, sfoara, lotus, deget,

mormoloc, om

Tabelul 1-3: Exemplu de reprezentare a numărului 4622 la egipteni

Obs.: acesta nu era un sistem de numeraţie poziţional, deoarece nu conta poziţia pe care

sunt amplasate diversele simboluri (puteau fi puse oriunde si numărul ar fi fost acelaşi).

După aceea au dezvoltat un sistem mai compact de scriere in care au atribuit câte un

simbol fiecărui număr intre 1 si 10, câte un alt simbol pentru fiecare multiplu de 10 pina

in 100 (10,20,30...), altele pentru multiplii de sute, etc. A rezultat astfel un sistem de

numeraţie cu foarte multe simboluri, insa mai compact decât cel iniţial.

Un alt sistem de numeraţie cunoscut, este cel roman in care sunt alocate simbolurile

I,V,X,L,C,D,M pentru 1,5,10,50,100,500,1000, împreuna cu reguli pentru formarea

numerelor.

Sistemul de numeraţie pe care îl folosim astăzi, in care fiecare cifra are o valoare

absoluta, si o valoare data de poziţie (zeci, sute, mii,...) este un sistem de numeraţie

poziţional (poziţia pe care este cifra contează) este originar din India si a ajuns in Europa

de la arabi (de aici denumirea de cifre arabe).

1.1.2 Baza 10

Sistemul de numeraţie zecimal este format din 10 simboluri(cifre): 0,1,2,3,4,5,6,7,8,9, cu

ajutorul cărora se formează toate numerele. Acelaşi simbol poate semnifica o cantitate

diferita, in funcţie de poziţia pe care se afla. Convenţia folosita este, cu cat o cifra se afla

pe o coloana mai in stânga cu atât este mai semnificativa. Prima coloana din dreapta este

cea a unităţilor, următoarea reprezintă numărul de „zeci‟, următoarea numărul de „sute‟,...

In tehnica de calcul, pe lângă baza 10 (sistemul de numeraţie zecimal), sunt folosite

bazele de numeraţie 2, 8, 16, iar sistemele de numeraţie respective se numesc binar, octal,

hexazecimal.

1.1.3 Baza 2

Sistemul de numeraţie binar are in componenta sa doar cifrele 0 si 1.

Page 3: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

3 Chiculiţă, v.2011-03-02

In interiorul calculatoarelor, informaţia de orice fel este reprezentata ca secvenţe de 0 sau

1; aceasta deoarece calculatoarele folosesc o logica binara, reprezentând cele doua valori

logice folosind 2 nivele de tensiune (ex: 0V si 5V).

La baza, calculatoarele sunt dispozitive electronice si intr-un astfel de dispozitiv (digital)

tensiunea este sau nu in circuit. S-a stabilit convenţia ca prezenta tensiunii va fi

reprezentata ca 1 logic si absenta ei ca 0 logic.

Câteva valori utile de ţinut minte:

24 = 16

28 = 256

210

= 1024

216

= 65536

Cel mai mare număr ce se poate reprezenta pe n cifre in baza b este: nmax = bn-1.

Astfel, in zecimal, numărul maxim reprezentabil pe trei cifre este 103

– 1 = 999,

in binar, cantitatea maxima reprezentabila pe 8 cifre este 28

– 1 = 255 a cărui reprezentare

in baza 2 este 11111111.

Diverse stiluri de reprezentare a numerelor binare: 11001010(2) = 0b11001010 =

%11001010 = b‟11001010‟ = 11001010b = 1100 1010

1.1.4 Baza 16

In sistemul hexazecimal, cifrele cu valori cuprinse intre 10 si 15 sunt reprezentate prin

simbolurile: A,B,C,D,E,F (indiferent ca sunt majuscule sau minuscule), astfel cele 16

cifre(simboluri) ce compun baza 16 sunt: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.

O numărătoare in hexa arata cam aşa: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11,

12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 21, ...

Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind

folosite mai mult pentru a scrie compact numere binare. Motivul este ca fiecărei cifre

hexa ii corespund exact 4 cifre binare (vezi Tabelul 1-4)

Diverse stiluri de reprezentare a numerelor hexa: C3(16) = 0xC3 = C3h = 0C3h = $C3 Obs.:

Majoritatea asambloarelor (si compilatoarelor) interpretează ca număr doar simbolurile care

încep cu o cifra intre 0 si 9, orice începe cu o litera fiind interpretat ca o variabila

(eticheta/instrucţiune). De exemplu numărul hexa AE se va scrie ca 0AEh, asta pentru a nu fi

confundat cu simbolul/variabila “ae” sau “aeh”. Un zero (sau mai multe) in fata unui număr

nu ii schimba valoarea acestuia.

1.1.5 Baza 8 (octal)

Sistemul de numeraţie octal conţine numai cifrele de la 0 la 7, iar numărătoarea se

desfăşoară astfel: 0,1,2,3,4,5,6,7,10,11,12,13,14,15,16,17,20,21,..

Baza 8 este folosita deoarece unei grupe de 3 biţi îi corespunde o cifra in baza 8.

Diverse stiluri de reprezentare a numerelor octale: 37(8) = 037 = 0o37

Page 4: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

4 Chiculiţă, v.2011-03-02

Exemple pentru diverse baze3 de numeraţie:

Pentru a reprezenta o suta şaptezeci si patru de unităţi in baza 10 scriem: 174.

De fapt 174 = 1·100 + 7·10 + 4 = 1·102 + 7·10

1 + 4·10

0

Aceeaşi cantitate, reprezentata in baza 2 va fi scrisa astfel: 10101110

10101110 (2) = 1·27 + 0·2

6 + 1·2

5 + 0·2

4 + 1·2

3 + 1·2

2 + 1·2

1 + 0·2

0 = 128 + 32 + 8 + 4 +

2 = 174(10)

iar in baza 16 va fi reprezentata astfel: AE

AE(16) = 10·161 + 14·16

0 = 160 + 14 =174(10)

(deoarece A(16)=10(10) si E(16)=14(10) , vezi tabelul cu echivalenta hexa)

1.2 Conversii dint-o baza in alta

1.2.1 Conversia din baza 2 in baza 10

Se înmulţeşte fiecare cifra a numărului in binar cu 2 la puterea poziţiei cifrei; cifra cu

poziţia zero este cea mai din dreapta.

Exemplu: 1010 1110(2) = 1*27 + 0*2

6 + 1*2

5 + 0*2

4 + 1*2

3 + 1*2

2 + 1*2

1 + 0*2

0 =174(in

general pentru numerele in baza 10 nu se mai specifica explicit baza, deoarece aceasta

este baza cea mai folosita).

poziţia: 7 6 5 4 3 2 1 0

puterile lui 2: 27

26 2

5 2

4 2

3 2

2 2

1 2

0

Numărul in binar: 1 0 1 0 1 1 1 0

128 0 32 0 8 4 2 0 = 174

1.2.2 Conversia din baza 10 in baza 2

Conversia unui număr din baza 10 in baza 2 se poate face prin 2 metode:

1. Prin împărţiri succesive la 2:

a. Se împarte numărul la 2 si se notează restul;

b. se continua împărţirea câtului (obţinut) la 2 (notându-se restul de fiecare

data) pana se obţine catul zero;

c. se scriu resturile obţinute in ordine inversa

174 2

174 87 2

0 86 43 2

1 42 21 2

1 20 10 2

1 10 5 2

0 4 2 2

1 2 1 2

0 0 0

Page 5: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

5 Chiculiţă, v.2011-03-02

1

2. O alta metoda este aceea de a găsi acele puteri ale lui 2 care însumate să producă

numărul iniţial. (Exemple de puteri ale lui 2: 1, 2, 4, 8, 16, 32, 64, 128, ...)

Cat a

mai

rămas

din

numărul

iniţial

Descrierea algoritmului la fiecare pas.,( Atenţie!

Numărătoarea poziţiilor începe de la zero, crescând de la

dreapta spre stânga)

Numărul

binar

obţinut pana

la pasul

curent

174 ........

174 cea mai mare putere a lui 2 care încape in 174 este 128,

deci punem un 1 pe poziţia 7 (deoarece 27=128) si

continuam operaţia pe diferenţa rămasa(174-128 = 46)

1.......

46 cea mai mare putere a lui 2 care încape in 46 este 32, deci

punem un 1 pe poziţia 5 (deoarece 25=32) si facem

scăderea 46-32 = 14

1.1.....

14 cea mai mare putere a lui 2 care încape in 14 este 8, deci

punem un 1 pe poziţia 3 (deoarece 23=8) si facem scăderea

14-8 = 6

1.1.1...

6 puterea cea mai mare e 22=4, efectuam 6-4 = 2 1.1.11..

2 puterea cea mai mare e 21=2, efectuam 2-2 = 0 1.1.111.

0 Sfârşit. Am obţinut numărul 174 ca o suma de puteri ale lui

2: 174 = 1·27 + 1·2

5 + 1·2

3 + 1·2

2 + 1·2

1. Pe restul

poziţiilor punem 0

10101110

Obs: Metoda generala de conversie dintr-o baza in alta aşa cum a fost descrisa la începutul

capitolului (cu împărţiri repetate) nu o vom folosi in practica decât la transformarea unui

număr din baza 10 in alta baza, deoarece avem de efectuat împărţiri (în baza de plecare), si

noi suntem antrenaţi sa le facem uşor doar in baza 10.

De ex, daca am fi încercat aplicarea metodei generale la transformarea numărului 10101110(2)

din binar in zecimal ar fi trebuit sa-l împărţim (in binar) succesiv la zece= 1010(2) (care este

noua baza) ceea ce nu suntem antrenaţi sa facem:

10101110 / 1010 = cit:10001 rest:100

10001 / 1010 = cit:1 rest:111

1 / 1010 = cit:0 rest:1

Luând resturile in ordine inversa obţinem 174(10)

1.2.3 Conversia din baza 2 in baza 16

Pentru conversia unui număr întreg din baza 2 in baza 16, se împart cifrele reprezentării

in baza 2 a numărului in grupe de câte patru cifre binare, începând de la cifra cea mai

puţin semnificativa (cea mai din dreapta); dacă e nevoie se completează cu zerouri în faţa

pentru a obţine o grupare de 4 biţi, apoi se înlocuieşte fiecare grupa de patru cifre binare

cu cifra hexazecimala corespunzătoare (vezi Tabelul 1-4)

Page 6: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

6 Chiculiţă, v.2011-03-02

zecimal binar hexazecimal

0 0000 0

1 0001 1

2 0010 2

3 0011 3

4 0100 4

5 0101 5

6 0110 6

7 0111 7

8 1000 8

9 1001 9

10 1010 A

11 1011 B

12 1100 C

13 1101 D

14 1110 E

15 1111 F

Tabelul 1-4: Echivalenta zecimal - binar -hexa

Ex1:

0100 1011 1001 1111

4 B 9 F

Ex2: 101101

împărţim în grupe de câte 4 şi completăm în faţa cu zerouri: 0010 1101

0010 1101

2 D

1.2.4 Conversia din baza 16 in baza 2

Pentru fiecare cifra hexa se scriu cele patru cifre binare corespunzătoare:

8AC0h

8 A C 0

1000 1010 1100 0000

1.2.5 Conversia din baza 10 in baza 16

Conversia din baza 10 in baza 16 se face prin împărţiri succesive la 16 (asemănător cu

transformarea din baza 10 din baza 2)

Ex:

174 / 16 = cit:10, rest:14

Page 7: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

7 Chiculiţă, v.2011-03-02

10 / 16 = cit:0, rest:10

Luând resturile in ordine inversa obţinem numărul hexa: AE

1.2.6 Conversia din baza 16 in baza 10

Se înmulţeşte fiecare cifra (a numărului in hexa) cu 16 la puterea poziţiei cifrei. Ex:

1A2Eh = 1·163 + 10·16

2 + 2·16

1 + 14·16

0 = 4096 + 10·256 + 2·16 + 14 = 6702

1.3 Organizarea datelor

Bitul este cea mai mica unitate de reprezentare a informaţiei. Un bit este capabil sa

reprezinte doar doua valori diferite (de obicei zero sau unu). Dar in general se pot

reprezenta pe un bit oricare alte 2 valori/elemente diferite: 1/0, pornit/oprit, adevărat/fals,

roşu/verde. Nu se poate determina ce reprezintă un bit doar uitându-ne la el. O idee

importanta de reţinut este: datele sunt ceea ce definim/hotăram/decidem noi sa fie.

Un Nibble este o grupare de 4 biţi. Pe un nibble se pot reprezenta maxim 24 = 16 valori.

Astfel exista o corespondenta directa intre un nibble si o cifra hexazecimala. Orice număr

hexazecimal se poate reprezenta printr-o grupare de 1 sau mai mulţi nibble. Se folosesc in

special pentru a reprezenta o cifra hexazecimala sau pentru reprezentarea unei cifre BCD

(vezi NumereBCD)

Un Byte (Octet) este format din 8 biti si reprezintă cea mai mica unitate adresabila

pentru multe din microprocesoarele moderne.

Aceasta înseamnă ca memoria nu este văzuta ca un sir de biţi (Figura 1-2a) ci ca o

succesiune de octeţi (Figura 1-2b), fiecare având asociata o adresa de memorie. Orice

informaţie care circula in interiorul unui astfel de calculator este grupata in cel puţin 1

byte. Pentru a accesa(citi/scrie) o cantitate de informaţie mai mica de un octet (de

exemplu un singur bit) este necesara citirea unui octet întreg, citirea sau modificarea

bitului făcându-se ori cu instrucţiuni specializate, ori cu ajutorul operatorilor logici

(vezi OperatiiLogice).

a) 0101010011110100001111110101011111010101

b)

01010100 un octet la prima adresa

11110100 alt octet la cea de-a doua adresa

00111111

01010111

11010101

Figura 1-2 a) înşiruire de biţi b) organizare pe octeţi

Numerotarea biţilor (intr-un octet) se face de la dreapta spre stânga, începând de la zero.

Astfel bitul zero este cel mai puţin semnificativ si are poziţia cea mai din dreapta, bitul 7

este cel mai semnificativ si este cel mai din stânga (are cea mai mare pondere in

reprezentarea numerelor întregi). 7 6 5 4 3 2 1 0

Page 8: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

8 Chiculiţă, v.2011-03-02

Pe un octet se pot reprezenta maxim 28 = 256 valori diferite. (vezi mai jos despre ce

putem reprezenta pe un octet). Multiplii folosiţi pentru octet sunt puteri ale lui 2:

octeţi prescurtare

1 Kilobyte 210

1024 1 Ko 1 KB

1 Megabyte 220

1048576 1 Mo 1 MB

1 Gigabyte 230

1073741824 1 Go 1 GB de remarcat folosirea lui B mare. Se obişnuieşte folosirea lui B pentru bytes si a lui b

pentru biţi (ex: 512kb = 64KB)

Astfel un octet este compus din doi nibble; biţii 0..3 alcătuiesc nibble-ul cel mai puţin

semnificativ (Low Order) iar biţii 4..7 formează nibble-ul mai semnificativ (High Order). 7 6 5 4 3 2 1 0

Hi Nibble Lo Nibble

Word (cuvânt)

La modul general un word este o grupare de mai mulţi biţi ce pot fi accesaţi de procesor

intr-o singura operaţie. Exista microprocesoare la care un cuvânt poate avea de ex. 4, 12 sau 14 biţi, insa la

procesoarele moderne un cuvânt este multiplu de octet (ex: cuvânt 32 biţi)

In particular, pentru procesoarele din seria 80x86 (este vorba de PC-urile cu care lucram

în mod curent) un word este considerat ca având dimensiunea de 2 octeţi (=16 biti).

Numărul maxim de valori ce se poate reprezenta pe un astfel de word este 216

= 65536

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Hi Byte Lo Byte

Double Word (cuvânt dublu). Este format din 2 cuvinte, deci (pentru procesoarele din

familia 80x86) are o lungime de 32 de biţi (=4 octeţi), putând reprezenta 4 294 967 296

valori.

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

1.3.1 Reprezentarea numerelor mai mari de un octet (Little endian si Big endian)

Atunci când avem date ce sunt reprezentate pe mai mult de un octet si dorim sa le

scriem/citim in memorie (consideram cazul cel mai răspândit când fiecare locaţie de

memorie are 8 biţi) se pune problema in ce ordine vor fi puşi in memorie octeţii ce

compun informaţia. Exista doua metode folosite in practica:

1. Little Endian: Octetul cel mai puţin semnificativ se găseşte la adrese mai mici

(procesoare Intel)

2. Big Endian: Octetul cel mai semnificativ se găseşte la adrese mai mari

(procesoare Motorola, protocoale Internet)

Page 9: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

9 Chiculiţă, v.2011-03-02

Ex: Sa consideram numărul pe 32 de biţi: 3E44AC19h. Octetul cel mai puţin semnificativ

(cel mai din dreapta) este 19h, iar cel mai semnificativ este 3Eh. Mai jos este prezentat

modul cum sunt dispuşi octeţii in memorie pentru cele doua cazuri (Little si Big Endian),

pentru fiecare caz având doua diagrame, una când memoria este reprezentata pe verticala,

cu adresele crescând in sus, si una cu memoria reprezentata pe orizontala cu adresele

crescând către dreapta.

De retinut: Procesoarele din familia 80x86 folosesc reprezentarea Little Endian.

Se observa ca atunci când desenam locaţiile de memorie in plan orizontal, crescând către

dreapta, in reprezentarea Litttle Endian, octeţii numărului iniţial apar ca fiind scrişi pe

dos.

Little Endian 3E44AC19 Big Endian

3E

44

AC

19

19

AC

44

3E

19 AC 44 3E

3E 44 AC 19

Figura 1-3: Exemplu de reprezentare in format Little si Big Endian

1.4 Reprezentarea numerelor întregi (cu semn)

Pe n biţi putem reprezenta 2n valori diferite, de exemplu numerele de la 0 la 2

n-1. Daca

se doreşte reprezentarea si a numerelor negative atunci trebuie sa renunţam la o parte

(jumătate) din valorile pozitive, respectivele combinaţii binare alocându-se pentru

numere negative. Alte variante încercate de-a lungul timpului includ:

semn-magnitudine: Alocarea unui bit (de ex. cel mai semnificativ) separat pentru a indica

semnul (0=pozitiv, 1=negativ), iar pe restul ramaşi se reprezintă valoarea absoluta a

numărului. Ex:

0000 0111 = 7

1000 0111 = -7

complement faţa de 1: reprezentarea unui număr negativ se face plecând de la cel pozitiv şi

negând toţi biţii.

0000 0111 = 7

1111 1000 = -7

Dezavantajul major al variantelor de mai sus sunt existenta a doua reprezentări diferite pentru

zero, ce conduc la probleme atunci când se lucrează cu numere pozitive si negative.

ADRESE ADRESE

AD

RE

SE

AD

RE

SE

Page 10: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

10 Chiculiţă, v.2011-03-02

offset: toate numerele sunt scalate cu o anumita valoare; zero se consideră la mijlocul

intervalului (zero = 011111111(2))

1000 0110 = 7

1111 1000 = -7

Este încă folosită.

Metoda standard de reprezentare a numerelor negative este aceea in complement fata de

2, in tabelul de mai jos fiind prezentat cum se aloca valorile pozitive si negative atunci

când se face reprezentarea pe 8 biţi. Se observa ca putem reprezenta numere intre -128 si

127. In general pe n biţi putem reprezenta valori cu semn (folosind notaţia in complement

fata de 2) in intervalul [-2n-1

, 2n-1

-1].

Aceasta reprezentare are următoarele avantaje:

Adunările (operaţiile aritmetice) se fac la fel ca in cazul numerelor fără semn; de

fapt, acelaşi algoritm funcţionează şi pentru numere cu semn, şi pentru cele fără

semn (calculatorul nu face diferenţă intre ele – pentru el sunt tot secvenţe de biţi

la care aplica acelaşi algoritm pentru adunare);

Bitul cel mai semnificativ ne indica semnul numărului (0 daca este pozitiv, 1 daca

este negativ);

Pentru numerele cu semn pozitive reprezentarea se păstrează aceeaşi (ca la

numerele fără semn);

Exista o singura reprezentare pentru zero;

reprezentare

binar

interpretare

ca număr

fără semn

(pozitiv)

interpretare

ca număr

cu semn

11111111 255 -1 11111110 254 -2 11111101 253 -3 ........ 10000001 129 -127 10000000 128 -128

01111111 127 127 01111110 126 126 ........ 00000010 2 2 00000001 1 1 00000000 0 0

Algoritmul pentru conversia in/din complement fata de doi este:

1. Se neaga toţi biţii (ai reprezentării numărului in baza 2);

2. Se face adunare cu 1.

Page 11: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

11 Chiculiţă, v.2011-03-02

Exact acelaşi algoritm se aplica si atunci când avem un număr (in complement fata de 2)

in binar si vrem sa ii aflam echivalentul in zecimal si când avem o valoare zecimala

negativa pe care dorim sa o trecem in binar. Atenţie: Pentru a reprezenta numere cu semn (in complemente fata de 2) trebuie sa

hotăram dinainte care este numărul de biţi pe care vor fi reprezentate (Ex: 8, 16, 32

biţi), si sa păstram aceasta dimensiune constanta de-a lungul tuturor operaţiilor

aritmetice.

In exemplele de mai jos va fi vorba numai de numere cu semn reprezentate pe 8 biţi.

Ex1: Se da numărul binar 10011000, sa se afle ce cantitate reprezintă in zecimal.

Deoarece ni s-a specificat ca e un număr cu semn, ne uitam la bitul de semn;

deoarece este 1, înseamnă ca numărul este negativ, deci ii aplicam algoritmul de

conversie:

10011000 se neaga toţi biţii

01100111 00000001 Se aduna 1

01101000

convertit in zecimal rezulta 104

In concluzie: 10011000 -104

Ex2: Se da numărul binar 110010, sa se afle ce cantitate reprezintă in zecimal.

S-a specificat ca este vorba de numere pe 8 biţi, deci numărul dat se scrie ca

00110010, bitul de semn este zero, deci este număr pozitiv, îl convertim în baza

zece în mod normal şi rezultă +50.

Ex3: Sa se reprezinte in binar numărul -5

Pornim de la numărul pozitiv +5 si aplicam algoritmul de conversie: 00000101 se neaga toţi biţii

11111010 00000001 Se aduna 1

11111011

In concluzie: -5 11111011

Ex4: Sa se reprezinte in binar numărul -150.

In condiţiile iniţiale date (reprezentare de numere pe 8 biţi) nu putem reprezenta

numărul -150. (Am văzut mai sus ca pe un octet putem reprezenta numere cu semn

între -128 şi 127). Putem în schimb sa-l reprezentăm pe 16biti, daca completăm în

binar cu zerouri în faţă, înainte de a aplica algoritmul de conversie.

1.4.1 Exemple de operaţii aritmetice cu numere in baza 2 si in baza 16

Page 12: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

12 Chiculiţă, v.2011-03-02

Înainte de a începe operaţiile cu numere, este foarte important de remarcat faptul ca,

datele intr-un calculator sunt reprezentate pe un număr fix de biţi, si atunci când o

operaţie produce depăşire (de exemplu când numărul e format (in binar) numai din biţi de

1, si îl incrementam încă o data cu 1) atunci valoarea respectiva “se dă peste cap” (o ia

din nou de la zero). Acest lucru se produce natural in calculator, este ca si cum numerele

ar fi amplasate pe un cerc si tranziţia de la 111...111 la 000...000 nu este mai

extraordinară decât celelalte.

Deoarece există cazuri când este totuşi important de a şti când in urma unei operaţii s-a

produs “datul peste cap” (pe care îl numim “depăşire” – in engleza:”Carry”), exista un

indicator special, separat, setat de către calculator pentru indicarea acestui lucru.

Aşa cum se vede din Figura 1-4, calculatorul efectuează operaţiile in binar (desenele de

pe exterior) ca si cum s-ar afla pe un cerc (Exemplul este pentru un calculator ce lucrează

pe 3 biţi; trecerea de la 111 trece la 000 în mod natural)

Figura 1-4: Exemplu de reprezentare circulara a numerelor în cazul în care am avea un calculator ce

reprezintă datele pe 3 biţi

Problema apare pentru noi, în funcţie de ce fel de numere am considerat că reprezentăm.

Daca am considerat ca am reprezentat in binar numere fără semn pe 3 biţi (între 0 si 7),

atunci tranziţia de la 7 la 0 ne pune o problema neaşteptata (7+1=>0).

Daca însa am considerat ca am reprezentat in binar, pe 3 biţi numere cu semn (intre -4 si

3) atunci trecerea de la 111(-1) la 000(0) ni se pare naturala, în schimb “ruptura” apare la

tranziţiile din 011(3) in 100(-4) si invers.

Exemple de operaţii efectuate pe 8 biţi (si rezultatele date de calculator):

11111111 + 00000001 => 00000000

E5h+1Dh => 02h

Exemple de operaţii efectuate pe 16 biţi (si rezultatele date de calculator):

0000000011111111 + 0000000000000001 = 0000000100000000

E5h+1Dh => 102h

8000h + 8000h => 0

adunare in binar/hexa/zecimal adunare in

hexa

scădere in

hexa transport ++ + + -

operanzi 01100100

01100110

64h

66h

100

102

A971h

E945h

C4F8h

16B3h

Page 13: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

13 Chiculiţă, v.2011-03-02

rezultat 11001010 CAh 202 192B6h AE45h

observaţii In binar: 1+1=10

1+1+1=11

In hexa:

4+6=Ah “+” semnifica

un transport

“-“ semnifica

un împrumut

Exemplul cu adunarea in binar explicitat

0+0=0

0+1=1

1+1=10 (scriu 0, transport 1)

0+0+1=1

1+1=10(scriu 0, transport 1)

1+1+1=11 (scriu 1, transport 1)

0+0+1=1

Exemplul cu adunarea in hexa explicitat

1 + 5 = 6h

7 + 4 = 11(10) = Bh

9 + 9 = 18(10) = 12h

A + E + 1 = 10(10) + 14(10) + 1(10) = 25(10) = 19h

Exemplul cu scăderea in hexa explicitat

8 - 5 = 3h

F + B = 15(10) - 11(10) = 4h

14h - 6 = 20(10) – 6 = 14(10) = Eh

B - 1 = 11(10) - 1 = 10(10) = Ah

Observaţie: Întotdeauna (in orice baza am lucra) transportul maxim pe care il putem

avea de le o colana la asta este maxim 1; acelaşi lucru este valabil si pentru împrumut

(in cazul scăderii)

In caz ca avem nevoie sa facem operaţii cu numere cu semn care sunt reprezentate pe

număr diferit de biţi (ex: unele pe 8 biţi si altele pe 16 biţi) este nevoie sa facem extensia

semnului pentru numerele reprezentate pe mai putini biţi. Aceasta înseamnă ca o sa

copiem (în faţă) bitul de semn până ajungem la dimensiunea dorita (In cazul in care

numărul este pozitiv completam in fata cu zerouri, daca este negativ, adăugam in fata biţi

de unu)

Număr

zecimal

reprezentare binar hexa

105 8 biţi cu semn 01101001 69h

105 16 biţi cu semn 0000000001101001 0069h

-105 8 biţi cu semn 10010111 97h

-105 16 biţi cu semn 1111111110010111 FF97h

205 8 biţi fără semn 11001101 CDh

205 16 biţi fără semn 0000000011001101 00CDh

In cazul numerelor fără semn, extensia pe mai mulţi biţi se face adăugând in fata

zerouri (ex: 205 din tabelul de mai sus). A nu se încerca niciodată extensia semnului

pentru un număr fără semn! Ce s-ar fi întâmplat daca încercam sa extindem semnul

(adăugând în fată biţi de 1) pentru numărul 205 de mai sus?

Page 14: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

14 Chiculiţă, v.2011-03-02

Ex1: Sa urmărim cum se efectuează operaţia (-6) + 6. Vom lucra cu numere pe 8 biţi.

Il reprezentam mai întâi pe -6: 00000110 6, se vor neaga toţi biţii

11111001 00000001 se va aduna 1

11111010 acesta este -6

După care facem adunarea cu 6: 11111010 -6 00000110 +6

11100000000

Deoarece am stabilit ca lucram cu numere pe 8 biţi, vom păstra numai 8 biţi ai

rezultatului (cei mai din dreapta), si transportul care apare îl vom ignora, obţinând

astfel rezultatul corect (-6) + 6 = 0

Ex2: Avem doua numere in binar pe care vrem sa le adunam: -590 reprezentat pe 16 biţi 1111110110110010

-13 reprezentat pe 8 biţi 11110011

Pentru a putea efectua operaţia trebuie ca ambele numere sa fie reprezentate pe

acelaşi număr de biţi; deci este necesar sa reprezentam numărul -13 pe 16 biţi.

Deoarece îl avem pe -13 scris deja in binar, este de ajuns sa facem extensia

semnului. -590 reprezentat pe 16 biţi 1111110110110010

-13 reprezentat pe 16 biţi 1111111111110011

Daca ignoram depăşirea produsa

(bitul al 17-lea) obţinem corect,

-603 reprezentat pe 16 biţi

1111111110110100101

1.4.2 Reprezentarea numerelor reale (în binar)

Pentru a afla cum arată un număr real în binar, vom lua separat partea întreaga şi cea

fracţionară. Reprezentarea părţii întregi o facem standard, aşa cum am văzut mai sus.

Partea fracţionară o luam separat si facem înmulţiri succesive cu 2. După fiecare

înmulţire notăm partea întreagă a rezultatului, iar cu partea fracţionară continuam

îmnultirea cu 2; facem înmulţiri repetate pîna obtinem rezultatul 1 sau (mai probabil)

pana obtinem numarul de biţi necesari. Partea fracţionara este compusa din partea

intreaga a rezultatelor, luate in ordinea in care au fost obtinute.

10.625

11=1010(2)

0.625*2=1.25

0.25*2=0.5

0.5*2=1

0.625=.101(2)

deci 10.625=1010.101 = 1*23 + 0*2

2 + 1*2

1 + 0*2

0 + 1*2

-1 + 0*2

-2 + 1*2

-3

= 8 + 0 + 2 + 0.5 + 0.125

Page 15: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

15 Chiculiţă, v.2011-03-02

Exista mai multe moduri de codare pe octeţi a numerelor reale, dar acestea nu vor fi

expuse aici.

1.5 Operaţii logice

a b a AND b a OR b a XOR b NOT a

0 0 0 0 0 1

0 1 0 1 1 1

1 0 0 1 1 0

1 1 1 1 0 0 Tabelul 1-5: Funcţiile logice

Dându-se doua valori(numere), funcţiile logice operează bit cu bit; astfel se ia bitul

numărul zero al primului număr si bitul numărul zero al celui de-al doilea număr, se

aplica operaţia logica intre ei, obţinându-se bitul numărul zero al rezultatului; după care

se operează in continuare si celelalte coloane (independent una de cealaltă)

AND OR XOR NOT

N:

masca:

10101010

11110000

10101010

11110000

10101010

11110000

10101010

N’: 10100000 11111010 01011010 01010101

Tabelul 1-6: Exemplu de aplicare a funcţiilor logice. Numărul pe care se operează este AAh, masca

aplicata (cel de-al doilea număr) este F0h

AND OR XOR NOT

N:

masca(F0h):

stuvwxyz

11110000

stuvwxyz

11110000

stuvwxyz

11110000

stuvwxyz

N‟:

stuv0000

1111wxyz

____

stuvwxyz

________

stuvwxyz

Tabelul 1-7: Exemplu de aplicare a funcţiilor logice, pentru un număr ai cărui 8 biţi (consideraţi

necunoscuţi) au fost notaţi cu literele "stuvwxyz"; masca aplicata este F0h

Din Tabelul 1-7 se observă, ca, chiar daca valoarea biţilor din numărul iniţial este

necunoscută, în urma anumitor operaţii logice obţinem valori cunoscute(fixe, 0 sau 1) sau

chiar valoarea iniţială, în funcţie de biţii din masca aplicată(masca fiind cel de-al doilea

număr, cunoscut).

1.5.1 AND (si)

Cea mai folosita proprietate a operatorului AND este aceea de a putea forţa anumiţi biţi

dintr-un octet sa devina zero (lăsându-i pe restul nemodificaţi).

Astfel putem izola unul sau mai mulţi biţi care ne interesează dintr-un octet. In exemplul

din Tabelul 1-7 au fost izolaţi biţii “stuv” (poziţiile 4,5,6,7).

Exemplu: Se da un numar N pe 8 biti. Sa se puna bitii 2,4 si 7 pe 0 (resul sa ramana

nemodificati). Solutie: Alegem o masca ce contine 0 pe pozitiile ce vrem sa devina 0 si 1

pe pozitille care le vrem nemodificate. Masca este: 01101011 = 6Bh.

Page 16: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

16 Chiculiţă, v.2011-03-02

Deci: N‟ = N AND 6Bh

stuvwxyz Numarul N 01101011 masca = 6Bh

0tu0w0yz Rezultatul (N‟)

Exemplu: Daca vrem sa testam daca bitul 3 dintr-un octet are valoarea zero sau unu,

atunci cream o masca care are un unu pe poziţia 3 (pentru a păstra bitul) si in rest zerouri

(pentru a „elimina” restul biților); masca este 00001000 = 08h; in urma operaţiei AND

toţi biţii devin zero, cu excepţia celui de pe poziţia 3. Daca bitul “w” e zero, atunci

rezultatul final va fi numărul zero (00000000(2)), altfel va fi numărul 8 (00001000(2))

stuvwxyz octet necunoscut 00001000 masca = 08h

0000w000 rezultat după AND

rezultatul poate fi ori

00000000 = 0 ori 00001000 = 8

in funcţie de valoarea bitului w

1.5.2 OR (sau)

Cea mai folosita proprietate a operatorului OR este aceea de a putea forţa anumiţi biţi

dintr-un octet sa devina unu, ceilalţi rămânând neschimbaţi. Pentru a pune un bit de 1 pe

o anumita poziţie, este de ajuns sa facem OR intre numărul iniţial si o masca ce are un bit

de unu pe poziţia dorita (si in rest zero).

Exemplu: Daca dorim sa setam (punem pe 1) biţii 1 si 2 dintr-un octet, fără a-i modifica

pe ceilalţi trebuie sa facem SAU logic cu o masca având biţii de pe poziţiile respective

puşi pe 1 iar ceilalţi sa fie zero. In acest caz masca trebuie sa fie 06h.

stuvwxyz octet necunoscut (N) 00000110 masca = 06h

stuvw11z rezultat după OR (N‟)

Deci N‟ = N OR 06h

1.5.3 XOR (sau exclusiv)

Cu ajutorul funcţiei XOR putem sa inversam(negam) valoarea unui anumit bit, lăsându-i

pe restul nemodificaţi.

stuvwxyz octet necunoscut 00010000 masca = 10h

_

stuvwxyz

rezultat dupa XOR

Page 17: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

17 Chiculiţă, v.2011-03-02

Doua proprietăţi utile ale funcţiei XOR:

a) A xor A = 0

b) (A xor B) xor B = A De departe, cele mai multe utilizări ale lui XOR se bazează pe cea de-a doua

proprietate; ex:

1. metode banale de criptare (in care A este mesajul iar B este cheia);

2. metode simple de desen ce permit desenarea si ştergerea de elemente grafice fără

redesenarea întregii imagini (A este imaginea actuala, B este noul element de

desenat+şters)

1.5.4 Operaţii de deplasare si rotire

1.5.4.1 Deplasare stânga/dreapta

In operaţiile de deplasare toţi biţii ce compun un octet sau un cuvânt sunt deplasaţi cu un

număr de poziţii specificat la stânga sau la dreapta. Biţii care ies printr-o parte se pierd,

iar in partea opusa sunt introduşi biţi de zero.

stuvwxyz octet iniţial 0stuvwxy deplasat dreapta cu o poziţie

00stuvwx deplasat dreapta cu doua poziţii

In exemplul de mai jos numărul zecimal 13 (0Dh) a fost deplasat o poziţie la stânga.

Procesul a fost repetat de încă 4 ori.

număr reprezentat in

binar

hexa valoarea

in zecimal

00001101 0Dh 13

<<

00011010 1Ah 26

<<

00110100 34h 52

<<

01101000 68h 104

<<

11010000 D0h 208

<<

10100000 A0h 160

Daca se urmăreşte coloana cu reprezentarea numărului in zecimal se observa ca la fiecare

deplasare la stânga cu o poziţie valoarea numărului s-a dublat. Aceasta este o metoda

foarte eficienta de a realiza înmulţiri cu puteri ale lui 2. De exemplu daca dorim sa

înmulţim un număr cu 8, e de ajuns sa-l deplasam cu 3 poziţii la stânga (8=23), insa

trebuie avut grija ca rezultatul sa nu provoace depăşire (sa nu se piardă prin stânga biţi de

1, aşa cum s-a întâmplat in exemplul precedent la ultima deplasare).

Page 18: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

18 Chiculiţă, v.2011-03-02

In exemplul următor numărul zecimal 150 se deplasează de 3 ori cu cate o poziţie la

dreapta:

număr reprezentat in

binar

hexa valoarea

in zecimal

10010110 96h 150

>>

01001011 4Bh 75

>>

00100101 25h 37

>>

00010010 12h 18

Similar, la deplasarea biţilor cu o poziţie la dreapta observam ca efect secundar ca

valoarea in zecimal a numărului este la jumătate decât cea iniţiala. Astfel putem efectua

eficient împărţiri ale unui număr cu puteri ale lui 2. In caz ca numărul este impar (are

bitul cel mai puţin semnificativ egal cu 1) atunci in urma unei deplasării rezultatul obţinut

este doar catul împărţirii numărului iniţial la 2 (restul se pierde) (aşa cum se întâmpla in

exemplu, după cea de-a treia deplasare).

1.5.4.2 Deplasare aritmetica la dreapta

Am observat că operaţiile de deplasare la stânga sunt echivalente cu împărţirea la 2. Dar

acest lucru este valabil doar pentru numerele fără semn. Pentru a putea obţine acelaşi

efect şi pentru numerele cu semn, avem nevoie de o operaţie numită deplasare aritmetică

(la stânga). Această deplasare nu introduce biţi de 0 pe la stânga, ci duplică bitul de semn

(fie el 0 sau 1).

număr reprezentat in

binar

hexa valoarea

in zecimal

10010110 96h -106 >>

11001011 CBh -53 >>

11100101 E6h -27 >>

11110010 F2h -14 >>

Obs: La toate operaţiile de mai sus, în legătură cu bitul care iese şi se pierde: la

majoritatea procesoarelor, acest bit este încă stocat în Carry (înainte de a se pierde de tot).

1.5.4.3 Rotire stânga/dreapta

Operaţiile de rotire pe biţi se deosebesc de cele de deplasare prin faptul ca biţii care ies

printr-o parte nu se pierd, ci sunt introduşi prin capătul celălalt:

stuvwxyz Octet iniţial

zstuvwxy rotit dreapta cu o poziţie

yzstuvwx rotit dreapta cu încă o poziţie

Page 19: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

19 Chiculiţă, v.2011-03-02

număr reprezentat in binar

10010110 rotire>>

01001011 rotire>>

10100101 rotire>>

11010010

1.5.4.4 Rotire stânga/dreapta prin bitul Carry

In cazul rotirii prin Carry, bitul care iese nu este introdus imediat in partea cealaltă, ci

este transferat in Carry, prin partea opusa intrând in numărul de rotit vechea valoare a lui

Carry.

stuvwxyz Octet initial

stuvwxy rotit prin carry la dreapta cu o poziţie

zstuvwx rotit prin carry la dreapta cu doua

poziţii

1.6 Câmpuri de biţi şi date împachetate

Ex de cimpuri de biti in C: struct cimp {

int zi:5;

int luna:4;

int an:7;

} data;

Cea mai comoda si rapida metoda de a reprezenta o anumita informaţie este pe un

multiplu de octeţi, chiar daca exista biţi care nu sunt folosiţi (ex. daca reprezentam ziua

din luna pe un octet din totalul de 256 de valori ce pot fi reprezentate vom folosi efectiv

numai 31). In condiţiile in care spaţiul de memorie ocupat de date este critic, putem sa

folosim mai eficient memoria (in detrimentul vitezei) folosind date împachetate. Acesta

înseamnă reprezentarea informaţiei utile pe numărul minim de biţi posibili.

Exemplu: in unele sisteme de fişiere data ultimei modificări a unui fişier este stocata pe

16 biţi astfel:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Page 20: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

20 Chiculiţă, v.2011-03-02

An luna zi

- pentru a stoca ziua (1..31) avem nevoie de (un câmp de) 5 biţi (maxim 32 valori),

- pentru a stoca luna (1..12) avem nevoie de 4 biţi (maxim 16 valori),

- pentru a stoca anul (ultimele doua cifre) avem nevoie de 7 biţi (maxim 128 valori) –

vom reprezenta de fapt numărul de ani trecuţi din 1980; astfel se pot reprezenta ani intre

1980 si 2107.

Exemplu:

0000001010110011 =02B3 19 mai 1981

(0000001(2) = 1 =1981-1980; 0101(2)=5; 10011(2)=19)

0010111110011011 =2F9B 27 dec 2003

(0010111(2) = 23 =2003-1980; 1100 (2)=12; 11011 (2)=27)

Cum despachetam:

Dacă avem o informaţie împachetată(ca mai sus) pentru o obţine fiecare din părţile

componente, trebuie sa le izolăm (pe fiecare în parte), adică sa facem restul câmpurilor

zero (folosind AND si o masca), după care sa aducem informaţia de interes aliniată la

dreapta (folosind deplasări).

zi = data AND 001Fh

luna = (data AND 01E0) >> 5

anul = (data AND F800h) >>9 + 07BCh

Exemplu cum se despachetează valoarea 02B3h in părţile componente (zi/data/an)

hexa binar operaţie de efectuat

02B3 0000001010110011 001F 0000000000011111 AND

0013 0000000000010011

ziua = 19

hexa binar operaţie de efectuat

02B3 0000001010110011 01E0 0000000111100000 AND

0013 0000000010100000 >>5

5 0000000000000101

luna = 5

hexa binar operaţie de efectuat

02B3 0000001010110011 F800 1111111000000000 AND

0200 0000001000000000 >>9

1 0000000000000001 + 07BCh (=1800)

07BD 0000011110111101

anul = 1981

Cum împachetam:

Presupunem că avem elementele componente fiecare reprezentate separat pe unul sau mai

mulţi octeţi. Câteodată unele din elemente trebuie transformate (in exemplul dat numai

anul suferă o transformare). Fiecare din elementele componente trebuie aliniate

Page 21: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

21 Chiculiţă, v.2011-03-02

(deplasate la stânga) pe poziţia corespunzătoare. Apoi toate se compun într-un singur

„număr” folosind ori adunare (+), ori funcţia logica sau(OR).

Exemplu: Cum se împachetează data de 27 dec 2003:

hexa binar operaţia ce urmează a fi efectuată

07D3 0000011111010011 pornim de la an, 2003

0017 0000000000010111 anul trebuie procesat, deoarece nu îl

reprezentam direct: scădem 1980 si obţinem

23

2E00 0010111000000000 deplasam 9 poziţii la stânga, pentru a duce

câmpul anul pe poziţia lui

000C 0000000000001100 continuăm separat cu luna dec=12

0180 0000000110000000 deplasam 5 poziţii la stânga, pentru a duce

câmpul luna pe poziţia lui

001B 0000000000011011 continuăm separat cu ziua: 27

001B 0000000000011011 nu e nevoie de deplasări, e pe poziţia lui.

0010111000000000

0000000110000000

0010111110011011

combinăm cele 3 câmpuri (an+luna+zi):

folosind + sau OR

2F9B 0010111110011011 N final

în concluzie „formula” de împachetare este:

anul = anul – 1980

N = (anul<<9) OR (luna<<5) OR ziua

sau alt mod de a scrie (vezi 1.5.4.1):

N = (anul - 1980)*512 + luna*32 + ziua

Chiar daca folosirea valorilor împachetate este eficienta din punct de vedere al spaţiului,

ea este foarte ineficienta din punct de vedere al vitezei, deoarece este nevoie de

instrucţiuni suplimentare pentru a împacheta si despacheta datele in câmpurile de biţi

corespunzătoare.

1.7 Reprezentarea numerelor în formatul BCD (Binary Coded Decimal)

1.7.1 Formatul BCD despachetat

In formatul BCD despachetat fiecare cifra zecimala a unui număr se reprezintă pe un

singur octet.

Număr zecimal reprezentare BCD

despachetat

0 0000 0000

1 0000 0001

Page 22: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

22 Chiculiţă, v.2011-03-02

2 0000 0010

3 0000 0011

4 0000 0100

5 0000 0101

6 0000 0110

7 0000 0111

8 0000 1000

9 0000 1001

De exemplu numărul 174 se va reprezenta pe 3 octeţi, fiecare conţinând câte o cifra (1,7

si 4):

0000 0001 0000 0111 0000 0100 01h 07h 04h

Se observa ca întotdeauna pentru un număr BCD despachetat cei mai semnificativi 4 biţi

sunt zero, iar valoarea binara a celorlalţi 4 mai puţin semnificativi nu depăşeşte 9. Acest

tip de reprezentare a numerelor este foarte neeconomic, din cele 256 de combinaţii

posibile ce se pot reprezenta pe un octet, numai 10 sunt folosite. Avantajul este insa acela

al conversiei rapide dintre un număr reprezentat in format BCD intr-un sir de

caractere(reprezentând valoarea numărului in zecimal)

Operaţii cu numere BCD despachetate:

Ex1. daca adunam numerele 6 si 2 reprezentate in BCD despachetat, obţinem rezultatul 8

care este un număr valid BCD despachetat:

binar valoare zecimal valoare BCD

0000 0110 + 6 6

0000 0010 2 2

0000 1000 8 8

Ex2. daca adunam numerele 3 si 9 reprezentate in BCD despachetat, obţinem rezultatul

12 (0000 1011 in binar) care nu este un număr valid BCD despachetat:

binar valoare

zecimal

valoare

BCD 0000 0011 + 3 3 0000 1001 = 9 9

0000 1100 12 -?-

0000 0001 0000 0010 12

Rezultatul corect din punct de vedere BCD despachetat trebuie sa fie pe 2 octeţi, primul

cu valoare 1, cel dea-l doilea cu valoare 2:

0000 0011 +

0000 1001 =

0000 0001 0000 0100

Pentru adunarea numerelor in format BCD despachetat (presupunem ca numerele sunt

formate din mai multe cifre) se procedează astfel:

se aduna doua cifre (de pe poziţiile corespunzătoare, începând de la dreapta);

Page 23: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

23 Chiculiţă, v.2011-03-02

daca rezultatul adunării este mai mare decât 9, atunci scădem 10 din rezultat si

păstram un transport pentru a fi adunat la următoarea operaţie (la coloana din

stânga).

1.7.2 Formatul BCD împachetat

In formatul BCD împachetat o cifra zecimala se reprezintă pe 4 biţi (pe un nibble), astfel

pe un octet se pot reprezenta 2 cifre zecimale, deci numere intre 0 si 99. De exemplu

numărul 91386 se reprezintă astfel:

0000 10001 0001 0011 1000 0110 in hexa: 09h 13h 86h.

1.8 Setul ASCII a caracterelor

Caracterele care sunt introduse de la tastatura, afişate pe ecran sau tipărite la imprimanta

au o valoare numerica asociata. Aceste valori se găsesc in tabela caracterelor ASCII.

Ex: caracterul „A‟ are codul 41h = 65

Figura 1-5: Tabela carterelor ASCIIE (prima cifra hexa e pe coloana din stânga, a doua cifra hexa

este pe linia de sus)

Funcţiile de interfaţa cu utilizatorul (din limbajele de nivel jos), cum ar fi afişarea pe

dispozitivele de ieşire, citirea de la dispozitivele de intrare lucrează doar cu caractere

(şiruri de caractere). Rutinele de tipărire primesc un număr (codul ASCII) si afişează

caracterul corespunzător conform cu Figura 1-5. Rutinele de citire preiau un caracter de

la utilizator si returnează in program codul ASCII.

De exemplu, daca in urma unei operaţii aritmetice (în program) am obţinut rezultatul 1 si

încercam sa-l afişam, pe ecran va apare caracterul . Ceea ce am fi dorit ar fi fost sa

apăra caracterul , al cărui cod ASCII este însa 31h (vezi Figura 1-5). Pentru a

transforma o valoare numerica (binara) din intervalul 0..9 in codul ASCII al caracterului

corespunzător „0’..’9’ (caractere ce au codul intre 30h si 39h), este de ajuns sa adunam

30h.

Pentru operaţia inversa, de transformare din unul din caracterele din intervalul „0’..’9’ in

valoare numerică, vom scădea 30h (sau punem pe 0 nibble-ul mai semnificativ)

Page 24: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

24 Chiculiţă, v.2011-03-02

Alt exemplu: Sa presupunem ca am citit de la tastatura şirul de caractere „174‟; cei trei

octeţi citiţi(obţinuţi) având valorile 31h, 37h, 34h. Pentru a-i transforma in numere (in

format BCD despachetat) e de ajuns sa scădem din fiecare 30h, obţinând valorile 01h,

07h si 04h (ce reprezintă cifrele componente ale numărului). Cu aceste numere putem

acum efectua operaţii aritmetice (in format BCD despachetat). Pentru a obţine insa (tot)

numărul 174 AEh pe un singur octet trebuie sa facem operaţii mai complicate (fiecare

cifra zecimala trebuie înmulţita cu puterea corespunzătoare a lui 10).

Observaţii:

1. ASCII este un cod pe 7 biţi, reprezentând 128 de caractere diferite. Setul ASCII

Extins al caracterelor este prezentat in tabelul Figura 1-5, incluzând si codurile

mai mari ca 7Fh. Totuşi, în continuare când ne vom referi la caractere ASCII

vom înţelege toate caracterele cu codurile de la 0 la 255.

2. Simbolurile (reprezentând cifrele) de la 0 la 9 au drept corespondent codurile

30h-39h.

3. Simbolurile reprezentând literele mari ale alfabetului se găsesc intre 41h – 5Ah;

4. Simbolurile reprezentând literele mici ale alfabetului se găsesc intre 61h – 7Ah;

5. Multe dintre caracterele cu coduri mai mici decât 20h nu sunt tipăribile, ci sunt

caractere de control (de exemplu codurile 0Dh, 0Ah, ce determina trecerea la linia

următoare = ENTER)

Şiruri de caractere:

Un sir de caractere1 este o înşiruire de caractere ASCII, fiecare ocupând un octet, si

având o metoda de determinare a lungimii. Cele doua metode mai cunoscute sunt:

1. Şiruri de tip Pascal (pe prima poziţie se afla lungimea şirului):

05 41 63 75 6C 21

Obs: dacă lungimea o stocăm pe un singur octet, atunci putem stoca şiruri de

lungime maxima 255. Primul element al şirului începe de la sir[1].

2. Şiruri de tip C (şirul se termina cu caracterul având codul zero):

41 63 75 6C 21 00

Obs: şirul poate fi oricât de mare însa nu poate conţine caracterul cu codul 00;

pentru a afla lungimea lui trebuie întâi sa-l parcurgem pe tot. Primul element al

şirului începe de la sir[0].

In ambele exemple de mai sus au fost scrise valorile hexa ale octeţilor ce compun

şirul de 5 caractere “Acum!”.

Diverse lucruri ce se pot reprezenta pe un octet:

1. numere pozitive in codificare binara in intervalul [0, 255]

2. numere cu semn reprezentate in complement fata de 2 in intervalul [-128, 127]

3. 256 de caractere (conform cu tabela codurilor ASCII)

4. numere BCD despachetate in intervalul [0, 9]

5. numere BCD împachetate in intervalul [0, 99]

1 in stilul clasic. Mai nou reprezentarea şirurilor de caractere se face prin prin alt tip de codare,

„unicode”(daca daţi in MS_Word->Insert->Symbol si selctati un caracter, veţi vedea afişat si codul lui in

codarea „unicode”

Page 25: Reprezentarea interna a informatiei/datelor - etc.ugal.ro · Operaţiile aritmetice cu numere hexa nu sunt folosite prea mult, numerele in hexa fiind folosite mai mult pentru a scrie

25 Chiculiţă, v.2011-03-02

Exemple de numere in binar si diverse moduri de interpretare:

Informaţie(binar): 0000 0101 0100 0001 10000101

Număr fără semn: 5 65 (=41h) 133 (=85h)

Număr cu semn: 5 65 -123

Caracter: A à

BCD despachetat: 5 - -

BCD împachetat: 5 41 85

Concluzie:

Atunci când se programează la nivel jos este de datoria programatorului să ştie ce tip de

date a stocat la o anumita locaţie de memorie ce semnificaţie au biţii (sau octeţii) cu care

lucrează, cum sa ii interpreteze, si ce operaţii să facă asupra lor (astfel încât sa obţină

rezultatul dorit).

Pentru microprocesor nu exista decât biţi (sau octeţi), nu exista nici un indicator care sa

specifice care reprezintă numere cu semn sau fără, litere, sau orice altceva.

Aceasta, in contrast cu limbajele de nivel înalt unde acest lucru este stabilit prin

intermediul unui tip de date (ex: întreg, real, char, pointer), memoria este gestionata de

compilator, acesta are grija ca datele sa fie interpretate in conformitate cu tipul lor si de

asemenea (poate) impune restricţii asupra operaţiilor legale ce se pot efectua asupra

fiecărui tip de date.