Documente Academic
Documente Profesional
Documente Cultură
C01 IntroNumere N PDF
C01 IntroNumere N PDF
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 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
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‟,...
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.
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.
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)
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
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)
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
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
6 Chiculiţă, v.2011-03-02
10 / 16 = cit:0, rest:10
Luând resturile in ordine inversa obţinem numărul hexa: AE
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 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
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.
3E 19
ADRESE
ADRESE
44 AC
AC 44
19 3E
19 AC 44 3E 3E 44 AC 19
ADRESE ADRESE
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ă.
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:
In concluzie: -5 11111011
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
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
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)
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
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.
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ă)
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).
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))
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.
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)
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).
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).
18 Chiculiţă, v.2011-03-02
număr reprezentat in binar
10010110 rotire>>
01001011 rotire>>
10100101 rotire>>
11010010
Ex de cimpuri de biti in C:
struct cimp {
int zi:5;
int luna:4;
int an:7;
} data;
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
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).
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:
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
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).
Figura 1-5: Tabela carterelor ASCIIE (prima cifra hexa e pe coloana din stânga, a doua cifra hexa
este pe linia de sus)
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!”.
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