This is an old revision of the document!
Responsabili: Emil Racec (2012) Bogdan-Cristian Drutu (2010)
În urma parcurgerii acestui laborator studentul va fi capabil să:
Tipurile de date reprezintă tipul de informație care poate fi stocat într-o variabilă. Un tip de data definește atât gama de valori pe care o poate lua o variabilă de un anume tip cât și operațiile care se pot efectua asupra ei. În continuare sunt prezentate tipurile fundamentale ale limbajului C, împreună cu o scurtă descriere a acestora:
char
- reprezentat printr-un număr pe 8 biți (un byte), stochează un caracter, definit în C printr-un număr în intervalul [-128; +127]. De observat că valorile pozitive codifică caracterele standard ASCIIint
- stochează numere întregi. Lungimea sa (și implicit plaja de valori) este dependentă de compilator si sistemul de operare considerat. De obicei, pe Linux, int se reprezintă pe 32 de biți (deci 4 bytes). În acest caz, poate memora numere între –2.147.483.648 și 2.147.483.647float
- reprezintă un număr real stocat în virgulă mobilă, simplă precizie (7 cifre), în gama de valori 3.4E +/- 38(reprezentat pe 4 bytes)double
- reprezinta un număr real stocat în virgulă mobilă, dublă precizie (15 cifre), în gama de valori 1.7E +/- 308 (reprezentat pe 8 bytes)Acestor tipuri fundamentale li se mai pot adăuga un număr de calificatori, după cum urmează:
short
- aplicabil doar pentru int, rezultând, de obicei, un întreg pe 2 octețilong
- aplicabil doar pentru int. Rezultă un întreg pe 32 de biți (4 octeți), schimbare semnificativa doar pentru Windows)unsigned
- precizează faptul că valoarea variabilei este pozitivă. Aplicabil doar tipurilor întregi
În cazul în care este absolut necesar ca tipul întreg să aibă o anumită lungime (ca în cazul lucrului cu structuri, care va fi discutat într-un laborator viitor), este indicată consultarea cu atenție a documentației compilatorului. Compilatorul GCC pune în acest sens la dispoziția programatorului, următoarele tipuri de întregi cu lungime clar specificată: uint_8
, uint_16
, uint_32
, uint_64
- pentru întregi fară semn pe 8, 16, 32 respectiv 64 de biți int_8
, int_16
, int_32
, int_64
- pentru întregi cu semn reprezentați pe 8, 16, 32 respectiv 64 de biți.
Determinarea corectă a tipurilor de date care vor fi folosite este esențială pentru securitatea și buna funcționare a aplicațiilor pe care le scrieți. În cazul în care valoarea conținută de o variabilă depașește limitele impuse de tipul de date folosit, se produce așa-numit-ul over-flow care poate cauza erori aparent inexplicabile. (Ca o anecdotă, în fiecare an (până acum trei sau patru ani), Bill Gates primea de la FISC o scrisoare prin care era somat să iși platească taxele, deoarece apărea in evidențele lor ca având datorii însemnate. Asta deoarece valoarea averii lui (mult peste 4.000.000.000$) producea un overflow în softul folosit de către FISC. În final situația a fost soluționată, introducând un câmp special pentru el în softul folosit. (A modifica softul peste tot ar fi introdus un plus de stocare nejustificat pentru fiecare din cei aproximativ 300.000.000 de cetațeni ai SUA.) )
Operatorii limbajului C pot fi unari, binari sau ternari, fiecare având o precedenţă şi o asociativitate bine definite. Tabelul următor sintetizează operatorii limbajului C. Operatorii sunt prezentaţi în ordine descrescătoare a priorităţii.
Precedenţă | Operator | Descriere | Asociativitate | |||
---|---|---|---|---|---|---|
1 | [] | Indexare | stanga-dreapta | |||
. şi -> | Selecţie membru (prin structură, respectiv pointer) | stânga-dreapta | ||||
++ şi -- | Postincrementare/postdecrementare | stânga-dreapta | ||||
2 | ! | Negare logică | dreapta-stânga | |||
~ | Complement faţă de 1 pe biţi | dreapta-stânga | ||||
++ şi -- | Preincrementare/predecrementare | dreapta-stânga | ||||
+ şi - | + şi - unari | dreapta-stânga | ||||
* | Dereferenţiere | dreapta-stânga | ||||
& | Operator adresă | dreapta-stânga | ||||
(tip) | Conversie de tip | dreapta-stânga | ||||
sizeof() | Mărimea în octeţi | dreapta-stânga | ||||
3 | * | Înmulţire | stânga-dreapta | |||
| Împărţire | stânga-dreapta | | ::: | % | Restul împărţirii | stânga-dreapta | | 4 | + şi - | Adunare/scădere | stânga-dreapta | | 5 | << si >> | Deplasare stânga/dreapta a biţilor | stânga-dreapta | | 6 | < | Mai mic | stânga-dreapta | | ::: | <= | Mai mic sau egal | stânga-dreapta | | ::: | > | Mai mare | stânga-dreapta | | ::: | >= | Mai mare sau egal | stânga-dreapta | | 7 | == | Egal | stânga-dreapta | | ::: | != | Diferit | stânga-dreapta | | 8 | & | ŞI pe biţi | stânga-dreapta | | 9 | | | SAU-EXCLUSIV pe biţi | stânga-dreapta | | 10 | | | SAU pe biţi | stânga-dreapta | | 11 | && | ŞI logic | stânga-dreapta | | 12 | | | SAU logic | stânga-dreapta | | 13 | :? | Operator condiţional | dreapta-stânga | | 14 | = | Atribuire | dreapta-stânga | | ::: | += şi -= | Atribuire cu adunare/scădere | dreapta-stânga | | ::: | *= şi /= | Atribuire cu multiplicare/împărţire | dreapta-stânga | | ::: | %= | Atribuire cu modulo | dreapta-stânga | | ::: | &= si | = | Atribuire cu ŞI/SAU | dreapta-stânga | | ::: | |