Documente Academic
Documente Profesional
Documente Cultură
Numr de bii
8
16
32
64
-
Domeniu de valori
-128 ...127
- 32,768 ... 32,767
- 3.4 * (10^38) ... 3.4 * (10^38)
- 1.7 * (10^308) ... 1.7 * (10^308)
Nici o valoare (mulimea vid)
Numar de biti
8
16
32
32
Domeniu de valori
0 ...255
0 ...65,535
- 2,147,483,648 ... 2,147,483,647
0 ... 4,294,967,295
Utilizarea modificatorului signed pentru ntregi este permis dar este inutil pentru c declaraia
implicit de ntreg presupune un numr cu semn.
Modificatorul long poate fi utilizat fr a preciza tipul aspra cruia se aplic, n mod implicit va
fi considerat tipul ntreg.
Programarea Calculatoarelor
Diferena ntre ntregii cu semn i cei fr semn consta n modul n care este interpretat bitul de
cel mai mare ordin al ntregului. n cazul numerelor cu semn, bitul cel mai semnificativ are rolul de a
indica semnul: valoarea 0 a bitului indic un numr pozitiv iar valoarea 1 un numar negativ. n cazul
numerelor fr semn bitul cel mai semnificativ conine informaie util.
4.2
Operatori
Actiune
Mai mare dect
Mai mare sau egal
Mai mic
Programarea Calculatoarelor
<=
==
!=
Operator
&&
||
!
Actiune
SI
SAU
NU
Tabel 4.4 Operatori logici
Tabelul cu valorile de adevr pentru operatorii logici este prezentat folosind cifrele 1 i 0.
a
0
0
1
1
b
0
1
0
1
a && a
0
0
0
1
a || b
0
1
1
1
!a
1
1
0
0
Exemplu:
int a=3,b=4,c=0,rez;
rez=!(a < c) && (a<b) || (b<=c);
printf(%d\n,rez);
ntreg B
0
0
1
1
0
1
0
1
&
0
0
0
1
Rezultatul
^
0
1
1
0
|
0
1
1
1
Indiferent de scopul n care sunt utilizai operatorii, maniera n care sunt folosii este n general
aceeai. n cele ce urmeaz, se vor descrie pe scurt principiile de baz ale utilizrii lor.
Observaie: Operatorii la nivel de bit nu modific valoarea operanzilor (se comport ca i
operatorii aritmetici obinuii), astfel o operaie n << 2 va rezulta ntr-un nou numr, fr a modifica
valoarea variabilei n. Pentru a modifica valoarea variabilei n trebuie s avem o atribuire:
Programarea Calculatoarelor
n = n << 2;
Exemplu de folosire a operatorului AND - afiarea unui bit dintr-un ntreg.
Pentru a afla un bit din reprezentarea binar a unui numr zecimal, se poate realiza o operaie
AND ntre numrul n format binar i numrul binar care are doar bitul X egal cu 1 (unde X este egal
cu numrul bitului care se dorete aflat). Rezultatul va fi diferit de 0 dac bitul respectiv este 1 i va fi
0 dac bitul respectiv este 0.
Exemplu: dac dorim s aflm valoarea bitului de pe pozitia 3 (numrarea ncepe de la 0 i se
face de la dreapta la stnga) a intregului 108:
int a=108;
/*0000 0000 0110 1100*/
int masca=8;
/*0000 0000 0000 1000*/
if(a & masca)
/*0000 0000 0000 1000*/
/*bitul are valoarea 1*/
else
/*bitul are valoarea 0*/
Operatorul AND (&) se poate folosi i pentru a masca anumii bii dintr-un numr:
Exemplu:
n = n & 177
va pune pe 0 biii din n corespunztori valorilor zero din reprezentarea binar a numrului 177 (adic
10110001), biii cu valoarea 1 rmnnd nemodificai.
Operatorii de deplasare (<< i >>) realizeaz deplasarea biilor din operandul stng cu attea
poziii cte sunt indicate de operandul drept.
Deplasarea la stnga (<<) completeaz la dreapta cu 0 (biii din stnga se vor pierde), iar la
dreapta numrului se completeaz cu 0.
Exemplu:
int a=255;
/* 0000 0000 1111 1111*/
a=a<<3;
/* 0000 0111 1111 1000*/
n cazul deplasrii la dreapta (>>), biii din dreapta se pierd, iar n stnga se introduc bii de 0,
n caz c numrul era de tip fr semn (unsigned) sau bii egali cu bitul de semn (cel mai din stnga
bit) n cazul numerelor de tip cu semn.
Numere fr semn:
unsigned int a= 32768;/*1000 0000 0000 0000*/
a=a>>3;
/*0001 0000 0000 0000*/
Numere cu semn:
int a=-18;
a=a>>3;
int b=18;
b=b>>3;
Operatorul de negare ~ realizeaz complementarea tuturor biilor unui numr (bitii de 0 se pun
pe 1, iar cei de 1 se pun pe 0)
Exemplu:
int a = 5171;
/* 0001 0100 0011 0011*/
a=~a;
/*1110 1011 1100 1100*/
ntruct ntregul a este cu semn, prin complementare bitul de semn a luat valoarea 1 i s-a obinut
un numr negativ.
Programarea Calculatoarelor
4.3
Funcii matematice
Limbajul C ofer o foarte mare libertate programatorului, libertate nentlnit n nici un alt
limbaj de programare, aceasta fiind una dintre caracteristicile care l-au fcut att de popular printre
programatori. Aceast libertate se reflect, n special, n manipularea tipurilor, compilatorul limbajului
C fiind mult mai puin restrictiv n privina folosirii tipurilor de date (nu face verificri referitoare la
compatibilitatea tipurilor).
Pentru a putea folosi aceste funcii ntr-un program, este necesar includerea fiierului header
MATH.H, folosind directiva #include <math.h>.
Cteva dintre funciile matematice folosite n limbajul C sunt urmtoarele:
sin
calculeaz funcia sinus a unui unghi (dat n radiani);
cos
calculeaz funcia cosinus a unui unghi (dat n radiani);
log
calculeaz logaritmul natural al unui numr;
log10
calculeaz logaritmul n baza 10 al unui numr;
sqrt calculeaz radicalul dintr-un numr;
pow
calculeaz funcia sinus a unei valori (a unui unghi);
random
returneaz o valoare aleatoare ntre 0 i parametrul dat 1; necesit
fiierul header STDLIB.H;
Nr.
Crt
1
sin
Tipul
returnat
double
Tipul
parametrului
double
cos
double
double
3
4
5
6
7
log
log10
sqrt
pow
random
double
double
double
double
int
double
double
double
double, double
int
Funcia
Observaii
valoarea se specific n
radiani
valoarea se specific n
radiani
parametru pozitiv
4.4
M_PI
constant, egal cu valoarea lui (3.14159363...); se mai poate aduga
eventual M_E.
Declararea constantelor
Programarea Calculatoarelor
TRUE
FALSE
NULL
AND
OR
EQUALS
1
0
0
&
|
==
gata = TRUE;
Directivele preprocesor sunt prelucrate de ctre compilator nainte de compilarea programului.
Secvena este urmtoarea: se proceseaz directivele, apoi simbolurile ce apar n cadrul programului
sunt nlocuite cu valoarea lor, iar ulterior programul este compilat.
Avantajele folosirii directivei #define
lizibilitate mrit a programului - citirea si nelegerea rapid a fiierului surs;
schimbrile ulterioare ale unor valori constante se pot face foarte uor;
Exemplu: modificarea valorii lui LIMIT de la 100 la 10.000 se face prin nlocuirea liniei:
#define LIMIT 100
cu linia:
#define LIMIT
10000
Daca nu s-ar fi folosit acest mod de definire a constantei LIMIT, atunci ar fi trebuit sa se
modifice peste tot in program 100 cu 10000.
Macroinstruciuni
Identificatorul definit prin #define poate fi substituit cu o instruciune.
Exemplu:
# define afiseaza(a) printf ("%.2f \n",a)
int main (void)
{
float b = 3.12;
afiseaza (b);
return 0;
}
n acest program preprocesorul va nlocui expresia
afiseaza (b)
cu
printf ("%.2f \n",n1);
De asemenea, #define poate fi folosit pentru a declara constante simbolice.
# define RAD2 1.41
Programarea Calculatoarelor
float x;
...
x = RAD2 * 15;
...
Ulterior, n program, nu se pot atribui valori constantelor simbolice.
4.5
Programarea Calculatoarelor
4.6
1.
2.
3.
4.
5.
S se scrie un program care citete de la tastatur lungimile laturilor unui triunghi i afieaz
aria acestuia, calculat cu formula lui Heron.
S se scrie un program care s citeasc un octet n baza 2 i s-l afieze n baza 10.
Realizai un program care s citeasc un numr pe un octet i s-l afieze n baza 2 (utiliznd
AND i deplasarea la dreapta).
S se scrie un program care seteaza n bii ncepnd cu poziia p ai unui ntreg citit de la
tastatur. ntregul va fi afiat n binar nainte de setarea biilor i dup ce acetia au fost setai.
S se scrie un program care inverseaz octeii unui ntreg fr semn citit de la tastatur. ntregul
va fi afiat n binar att nainte de inversare ct i dup inversare.
4.7
1.
2.
3.
Probleme propuse
ntrebri recapitulative
Care sunt principalii operatori matematici folosii n limbajul C? Dar operatori logici?
Pentru ce sunt folosii operatorii la nivel de bit?
Care este scopul folosirii directivei #define?