Documente Academic
Documente Profesional
Documente Cultură
0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0
0 1 2 C
Fig.2
Folosind puterile bazei 2, numărul 300 se scrie astfel:
300 =1x28 + 1x25+ 1x23+ 1x22 = 1x162 + 2x161 + 12x160
Deci, folosind o locație din MO de 2o forma internă și respectiv externă a
numărului 300 sunt:
(300)10 = (0000 0001 0010 1100)2 = (012C)16
Obs. Succesiunea de cifre (10) reprezintă baza de numerație respectiv:
(10)2 = 2 pentru baza 2 ; (10)10 = 10 pentru baza 10 și (10)16 = 16 pentru baza 16
Sau, folosind cifrele corespunzătoare pentru reprezentarea fiecărei baze de
numerație, aceeași reprezentare se poate scrie:
(300)10 = (0000 0001 0010 1100)2 = (012C)16
Reprezentarea aceluiași număr într-o locație a MO de 32biţi/4bytes are forma:
(300)10 = (00000000 00000000 00000001 00101100)2 = (00 00 01 2C)16
(2)
unde n este numărul de biți folosiți pentru reprezentare sau dimensiunea locației MO. În
exemplul considerat n=16.
Regula directă. Codul complementar se obține prin modificarea cifrelor binare, de la
stânga spre dreapta, până la ultimul bit care are valoarea =1, astfel: 0→1 respectiv 1→0.
Ultimul bit cu valoare =1 (indiferent de poziția sa în cadrul reprezentării) își păstrează
valoarea (rămâne nemodificat). Biții aflați la dreapta ultimei cifre 1, care sunt toți egali cu
zero, rămân neschimbați. Deci, spre deosebire de codul invers, ultimul bit cu valoarea
unu (cel mai din dreapta), rămâne neschimbat iar zerourile din dreapta acestuia își
păstrează valoarea.
Domeniul reprezentabil
Deoarece pentru reprezentarea valorii numerelor întregi cu semn se folosesc 15 biți,
valoarea maximă pozitivă reprezentabilă este:
Nmax ≤ 2 15 -1 = 32767
Codul complementar al valorii minime reprezentabilă, deci numărul negativ cu
modul maxim, este:
(Nmin)c=1000 0000 de unde se obține codul direct - (Nmin) d = (1000 0000)2 = -32768
Deci:
- 216 ≤ N ≤ 216 -1 sau N ∈ [-32768 , 32767]
Pentru cazul general, în care locația are m octeți/bytes, respectiv folosește n=mx8
biți, domeniul reprezentabil pentru valori întregi cu semn este:
- 2n ≤ N ≤ 2n -1
Erori de reprezentare
În situațiile în care valorile înscrise în locația MO nu corespund domeniului
corespunzător de reprezentare, valorile înscrise nu pot corespunde numărului considerat
iar interpretarea conținutului locației MO determină obținerea unui rezultat eronat, fără ca
eroarea de reprezentare să fie semnalizată.
Ex.4. a) Să se reprezinte numărul 40000 într-o locație având 2/16 o/biți. Forma
internă este:
Xd = (40000)10 = (1001 1100 0100 0000)2 = (9C40)16
Interpretarea conținutului acestei locații (b15=1) precizează faptul că numărul
reprezentat este un număr negativ iar reprezentarea este codul complementar față de 2 a
respectivului număr negativ. Codul direct, obținut conform regulii anterioare, este:
(X)c = (1001 1100 0100 0000)2 → (X)d = - (0110 0011 1100 0000)2 = - (63C0)16 =
-(25536)10
b) Să se reprezinte numărul -40000 într-o locație având 2o sau 16 biți. Forma
internă este:
Xd = - (40000)10 = - (1001 1100 0100 0000)2= - (9C40)16
Deoarece numărul care se reprezintă este un număr negativ se va înregistra în
locația MO codul complementar al valorii absolute a numărului.
Xd = - (1001 1100 0100 0000)2 → Xc = (0110 0011 1100 0000)2 = (63C0)16
Interpretarea conținutului reprezentării (b15 =0) precizează faptul că numărul
reprezentat este un număr pozitiv și deci reprezentarea constituie codul direct al
acestuia. Codul direct, obținut conform regulii anterioare, este:
Xd = (0110 0011 1100 0000)2 = (63C0)16 = ( 25536)10
c) Să se reprezinte numărul 70000 într-o locație având 2o sau 16 biți. Forma internă
este:
Xd = (70000)10 = ( 1 | 0001 0001 0111 0000 | )2 = (1 | 1170 | )16
Se observă că reprezentarea în baza 2 a numărului 70000 cuprinde 17 biți. În locația
de 16 b se vor înscrie numai ultimele 16 cifre ale numărului, ceea ce înseamnă că
numărul memorat este:
Xd = (0001 0001 0111 0000)2 = (1170)16 = (4464)10
Fig.4
Este evident că erorile datorate reprezentării ca număr de tip float cresc dacă
valoarea acestuia se obținute prin intermediul unor calcule complexe.
Ex.9 Fie variabile reale x și y care sunt definite astfel:
x=5.2 și y = x-3.2.
Se cere să se stabilească valoarea logică a expresiei (y = 2.0)? Verificând printr-un
program se obține rezultatul FALS, ceea ce din punct de vedere matematic este incorect,
eroarea fiind consecința modului de reprezentare a valorii reale a lui y. Interpretarea
grafică a situării valorii variabilei y în vecinătatea lui 2 este reprezentată în fig.5.
Fig.5
1.3. Operații relaționale
Pentru verificarea valorilor variabilelor (de ex. apartenența la un domeniu de
definiție) în programele de calcul se folosesc expresii relaționale și/sau logice (vezi și
pct.4).
Expresiile relaționale se alcătuiesc prin înlănțuirea operanzilor, care pot fi
expresii/variabile/constante numerice, cu ajutorul operatorilor relaționali. Rezultatul
evaluării unei expresii relaționale este o valoare logică: ADEVĂRAT/TRUE sau
FALS/FALSE. Se reamintește că aceste valori sunt exprimate printr-un numărul întreg
1 pentru valoarea logică ADEVĂRAT/TRUE sau prin valoarea 0 pentru valoarea logică
FALS/FALSE. Această valoare logică poate fi folosită pentru definirea modului de
efectuare a unor instrucțiuni (de decizie sau repetitive).
În C/C++, deși nu este definit tipul de date logic/boolean, se poate atribui unei
variabile de tip int rezultatul logic al evaluării unei expresii relaționale sau logice. În Java
sunt definite tipul boolean și valorile logice corespunzătoare acestuia: true/false. De
aceea alcătuirea în Java a unei expresii relaționale este mai explicită. Memorarea acestor
valori se efectuează conform convenției aplicate în C/C++.
Operatori relaționali, aceeași ca și în matematică, sunt:
< (mai mic); <= (mai mic sau egal);
> (mai mare); >= (mai mare sau egal);
!= diferit: = = (egal).
Prioritatea operatorilor relaționali este aceeași, dar este mai mică decât a
operatorilor aritmetici. De aceea, la evaluarea unei expresii relaționale se evaluează întâi
expresiile aritmetrice/algebrice și apoi, rezultatele astfel obținute sunt analizate prin
intermediul operatorilor relaționali.
Pentru evaluarea expresiilor relaționale la nivelul μProcesorului se calculează
diferența operanzilor, care nu poate fi decât o valoare numerică. În funcție de semnul
rezultatului: pozitiv/negative/zero se apreciază valoarea expresiei relaționale
ADEVĂRAT/FALS. Această valoare poate fi memorată printr-o variabilă întreagă. (vezi
Ex.10). Efectuarea acestui calcul NU modifică valorile operanzilor înscrise în MO.
Ex.10. Să se precizeze valoarea indicatorilor de condiție pentru secvența:
.............
int x=10, y;
y = x > =7;
Se efectuează operația: x - 7= 3 al cărei rezultat este un număr pozitiv. Deci se
stabilește că y =ADEVARAT și se memorează y = 1.
Ex.11 Pentru următoarea secvență C/C++ să se verifice formatul extern al
variabilelor de tip short folosite/calculate și să se comenteze rezultatele.
......................
int x=6, y=10; // x=(0006)16 ; y=(000A)16
y=x<=10; // y=(0001)16
y=(x+4) != 10; // y=(0000)16
y= (x = = 6); // y=(0001)16
....................
Ex.12 Pentru următoarea secvență Java să se precizeze formatul extern al
variabilelor de tip short folosite și să se comenteze rezultatul. Se va folosi formatul
extern.
......................
boolean x=true, y;
y=false;
y=(x+4) != 10; // The operator + is undefined for the argument boolean
y = (x = = 6); // The operator == is undefined for the argument boolean
......................
Obs. Spre deosebire de C/C++, în Java nu sunt acceptate expresii de calcul care
includ variabile de tip boolean și short, int, ș.a.
1.4. Operații logice
Toate limbajele de programare au definite operațiile logice. Forma de
implementare poate fi însă diferită. De aceea programatorul trebuie să cunoască modul în
care sunt definite aceste operații în limbajul de programare folosit pentru implementarea
programului său. Operațiile logice sunt implementate în două variante:
- cu considerarea globală a operanzilor (pe întreaga locație a MO) și
- cu aplicarea operatorilor la nivelul fiecărui bit al operanzilor.
X !X X Y X && Y X Y X || Y
F/0 A/1 F/0 F/0 F/0 F/0 F/0 F/0
A/1 F/0 F/0 A/1 F/0 F/0 A/1 A/1
A/1 F/0 F/0 A/1 F/0 A/1
A/1 A/1 A/1 A/1 A/1 A/1
Funcția x ⊕ y
Xi Yi Zi
F/0 F/0 F/0
F/0 A/1 A/1
A/1 F/0 A/1
A/1 A/1 F/0
1 1 2 3
X→ 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1
2 9 3 1
Y→ 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 1
~ X→ { a 1= ~ 1x
i i
1 0 1 1 1 0 1 1 0 1 1 1 0 0
X^Y→ { d0=x ^0 y 1
i i i
1 1 0 0 0 0 0 0 1 0 0 1 0
X>>2→ { e 0 =x0
i-2 i
0 0 0 1 0 0 0 1 0 0 1 0 0 0
X<<3→ { f 1 =x0
i+3 i
0 0 1 0 0 1 0 0 0 1 1 0 0 0
2. Întrebări de autocontrol
1. Ce este un byte? Care este denumirea în limba română?
2. De câți biți este necesar pentru a reprezenta numărul (13)10? Dar numărul
(6)16?
3. Câte cifre în baza 16 sunt necesare pentru reprezentarea unui număr binar pe
32biți?
4. Cum se deosebesc în reprezentarea binară numerele întregi pozitive de cele
negative? (considerând că sunt reprezentate pe 32 biți).
5. Cum se stabilește numărul de octeți necesari păstrării unei valori numerice?
6. Să presupunem că vrem să memorăm un număr care ocupă 27 biți. Câți octeți
vom rezerva în memorie pentru numărul respectiv?
7. Având în vedere codurile ASCII, câți biți sunt diferiți între reprezentările ’A’
și ’a’?
8. Ce sunt erorile de reprezentare? Pot apărea erori de reprezentare în cazul
numerelor întregi?
9. Cum se pot strecura erori în cazul operațiilor cu numere întregi?
10. Având în vedere secțiunea ”operații relaționale”, ce reprezintă semnul „< >„?
11. Ce valoare se memorează în limbajul C în cazul în care se evaluează expresia
3<6?
12. Ce operație reprezintă semnele: ~, ^, |, &, !, <<, >>?
13. Care este deosebirea dintre operatorul & și &&? Dar dintre | și || ?
3. Exerciții pentru fixarea cunoștințelor.
1. Realizați conversia următoarelor numere din baza 10 în baza 2 folosind
reprezentări pe 16 biți: 16, 32, 48, 63, 64, 128, 250, 255, 1024, 1280, 2048,
2050, 10000, 65535.
2. Realizați conversia următoarelor numere din baza 10 în baza 2 folosind
reprezentări pe 16 biți: -16, -32, -48, -63, -64, -128, -250, -255, -1024, -1280,
-2048, -2050, -10000, -32764.
3. Realizați următoarele operații folosind reprezentarea numerelor în baza 2:
a. 25+128=
b. 68+165=
c. -32+128=
d. -89-67=
e. 129-47=
f. 253+(-15)=
g. 12-158=
4. Transformaţi următorul număr 1101 0111 1010 1111 în formă hexazecimală.
Ce valoare reprezintă în baza 10?
5. a. Reprezentați -5 în formă binară pe 16 biţi.
b. Evaluaţi expresia 25+(-5) sub formă binară.
c. Transformaţi rezultatul în baza 10.
6. Realizați conversia în baza 2 pe 16 biți și aplicați operațiile logice NOT,
AND, OR la nivel de bit asupra următoarelor numere (sau combinații ale
acestora): 27, 35, 87, 96, -111, -145, 198, 243,-243
4. Exerciții pentru aprofundarea cunoștințelor.
1. Realizați conversia următoarelor numere din baza 10 în baza 16: 16, 32, 48,
63, 64, 128, 250, 255, 1024, 1280, 2048, 2050, 10000, 65535.
2. Realizați următoarele operații folosind reprezentarea numerelor în baza 16:
a. 25+128=
b. 68+165=
c. 32+128=
d. 89-67=
e. 129-47=
f. 223+15=
g. 192-158=
3. Reprezentați următoarele numere în format virgulă mobilă pe 32 biți (float):
12.5, 15.75, 23.625, 347.125, 655.375
4. Reprezentați următoarele numere în format virgulă mobilă pe 64 biți
(double):
39.5625, 3.25125
5. Considerând a=23, b=89, c= 162 realizați următoarele operații la nivel de bit:
!a=, !b=, !c=,
a&b=, a|b=, b&c=, c|b=,
!a&!b=, !(c|a)=,
!(a&c)=, (a|b)&(a&b)=.
6. Considerând a=23, b=89, c= 162 evaluați următoarele expresii logice:
a<b=, c>a=, (b<c)&&(b<a)=,
!(a>b)||!(c>a)=, !(a>b)=,
!(b>c)||(a<b)=, !((a<c)&&!(c>a))=.