Sunteți pe pagina 1din 25

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, pN*, p>1 a numărului întreg N succesiunea de cifre
xm,xm-1, ... x1,x0 unde xi verifica relaţiile:
a) 0xip-1, ()i=1,m xm0
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; ym0 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

1 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 *602 + 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.

2 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

3 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·101 + 4·100
Aceeaşi cantitate, reprezentata in baza 2 va fi scrisa astfel: 10101110
10101110 (2) = 1·27 + 0·26 + 1·25 + 0·24 + 1·23 + 1·22 + 1·21 + 0·20 = 128 + 32 + 8 + 4 +
2 = 174(10)
iar in baza 16 va fi reprezentata astfel: AE
AE(16) = 10·161 + 14·160 = 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*26 + 1*25 + 0*24 + 1*23 + 1*22 + 1*21 + 0*20 =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
7 6 5 4 3 2 1 0
puterile lui 2: 2 2 2 2 2 2 2 2
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

4 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 Descrierea algoritmului la fiecare pas.,( Atenţie! Numărul
mai Numărătoarea poziţiilor începe de la zero, crescând de la binar
rămas dreapta spre stânga) obţinut pana
din la pasul
numărul curent
iniţial
174 ........
174 cea mai mare putere a lui 2 care încape in 174 este 128, 1.......
7
deci punem un 1 pe poziţia 7 (deoarece 2 =128) si
continuam operaţia pe diferenţa rămasa(174-128 = 46)
46 cea mai mare putere a lui 2 care încape in 46 este 32, deci 1.1.....
5
punem un 1 pe poziţia 5 (deoarece 2 =32) si facem
scăderea 46-32 = 14
14 cea mai mare putere a lui 2 care încape in 14 este 8, deci 1.1.1...
3
punem un 1 pe poziţia 3 (deoarece 2 =8) si facem scăderea
14-8 = 6
6 puterea cea mai mare e 22=4, efectuam 6-4 = 2 1.1.11..
1
2 puterea cea mai mare e 2 =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 10101110
2: 174 = 1·27 + 1·25 + 1·23 + 1·22 + 1·21. Pe restul
poziţiilor punem 0

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)

5 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

6 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·162 + 2·161 + 14·160 = 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

7 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
10
1 Kilobyte 2 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)

8 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 19
ADRESE

ADRESE
44 AC
AC 44
19 3E

19 AC 44 3E 3E 44 AC 19

ADRESE ADRESE

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 2n-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.

9 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 interpretare interpretare


binar ca număr ca număr
fără semn cu semn 
(pozitiv)
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.

10 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

11 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 scădere in


hexa hexa
transport ++ + + -
operanzi 01100100 64h 100 A971h C4F8h
01100110 66h 102 E945h 16B3h

12 Chiculiţă, v.2011-03-02
rezultat 11001010 CAh 202 192B6h AE45h
observaţii In binar: In hexa: “+” semnifica “-“ semnifica
1+1=10 4+6=Ah un transport un împrumut
1+1+1=11

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 reprezentare binar hexa


zecimal
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?

13 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
1100000000

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 111111110110100101
(bitul al 17-lea) obţinem corect,
-603 reprezentat pe 16 biţi

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*22 + 1*21 + 0*20 + 1*2-1 + 0*2-2 + 1*2-3
= 8 + 0 + 2 + 0.5 + 0.125

14 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: 10101010 10101010 10101010 10101010
masca: 11110000 11110000 11110000
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: stuvwxyz stuvwxyz stuvwxyz stuvwxyz
masca(F0h): 11110000 11110000 11110000
____ ________
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.

15 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

16 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 hexa valoarea
binar 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).

17 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 hexa valoarea
binar 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 hexa valoarea


binar 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

18 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
zstuvwx 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

19 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

20 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 combinăm cele 3 câmpuri (an+luna+zi):
0000000110000000 folosind + sau OR
0010111110011011
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

21 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 valoare
zecimal 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);

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

23 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”

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

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

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