DATE IN LIMBAJUL C/C++

Un program realizeaza o prelucrare de informatie. Termenul de prelucrare trebuie sa fie considerat intr-un sens foarte general . in program datele apar fie sub forma unor constante (valori cunoscute anticipat, care nu se modifica), fie sub forma de variabile. Constantele şi variabilele sunt obiectele informationale de baza manipulate intr-un program.

Fiecare categorie de date este caracterizata de atributele:

-) Nume;

-) Valoare;

-) Tip;

-) Clasa de memorare.

Numele unei date

Numele unei date este un identificator şi, ca urmare, trebuie sa respecte regulile specifice identificatorilor. Deasemenea, numarul de caractere care intra in compunerea unui identificator este nelimitat, insa, implicit, numai primele 32 de caractere sunt luate in considerare. Aceasta inseamna ca doi identificatori care au primele 32 de caractere identice, diferentiindu-se prin caracterul 33, vor fi considerati identici.

TIPURI DE DATE

Tipul unei date consta intr-o multime de valori pentru care s-a adoptat un anumit mod de reprezentare in memoria calculatorului şi o multime de operatori care pot fi aplicati acestor valori. Tipul unei date determina lungimea zonei de memorie ocupata de acea data. in general, lungimea zonei de memorare este dependenta de calculatorul pe care s-a implementat compilatorul.

Tipurile de baza sunt:

-) char un singur octet (1 byte=8 biti), capabil sa contina codul unui caracter din setul local de caractere;

-) int numar intreg, reflecta in mod tipic marimea naturala din calculatorul utilizat;

-) float numar real, in virgula mobila, simpla precizie;

-) double numar real, in virgula mobila, dubla precizie.

In completare exista un numar de calificatori, care se pot aplica tipurilor de baza char, int, float sau double: short, long, signed şi unsigned. Astfel, se obtin tipurile derivate de date. Short şi long se refera la marimea diferita a intregilor, iar datele de tip unsigned int sunt intotdeauna pozitive. S-a intentionat ca short şi long sa furnizeze diferite lungimi de intregi, int reflectând marimea cea mai "naturala" pentru un anumit calculator. Fiecare compilator este liber sa interpreteze short şi long in mod adecvat propriului hardware; in nici un caz, insa, short nu este mai lung decât long. Toti aceşti calificatori pot aplicati tipului int. Calificatorii signed (cel implicit) şi unsigned se aplica tipului char. Calificatorul long se aplica tipului double. Daca intr-o declaratie se omite tipul de baza, implicit, acesta va fi int.

Tip

Lungimea zonei de memorie ocupate (în biţi)

Descriere


MS-DOS

UNIX

LINUX


char

8

8

Valoarea unui singur caracter; poate fi întâlnit în expresii cu extensie de semn

unsigned char

8

8

Aceeaşi ca la char, fară extensie de semn

signed char

8

8

Aceeaşi ca la char, cu extensie de semn obligatorie

int

16

32

Valoare întreagă

long

32

64

Valoare întreagă cu precizie mare

(long int)




long long int

32

64

Valoare întreagă cu precizie mare

short int

16

32

Valoare întreagă cu precizie mică

unsigned int

16

32

Valoare întreagă, fără semn

unsigned long int

32

64

Valoare întreagă, fără semn

float

32

32

Valoare numerică cu zecimale, simplă precizie (6 )

double

64

64

Valoare numerică cu zecimale, dublă precizie (10 )

long double

80

128

Valoare numerică cu zecimale, dublă precizie


Să considerăm, de exmplu, tipul int, folosit pentru date întregi (pozitive sau negative). Evident că mulţimea valorilor pentru acest  tip va fi, de fapt, o submulţime finită de numere întregi. Dacă pentru memorarea unei date de tip int se folosesc 2 octeţi de memorie, atunci valoarea maximă pentru aceasta va fi 1/2*216- 1, deci 215- 1 (32767), iar valoarea minimă va fi -1/2*216, deci -215 (-32768). Încercarea de a calcula o expresie de tip int a cărei valoare se situează în afara acestui domeniu va conduce la o eroare de execuţie.

Mulţimea valorilor pentru o dată de tip unsigned int (întreg fără semn) va fi formată din numerele întregi situate în intervalul [0, 216- 1]. 

În header-ul <values.h> sunt definite constantele simbolice (cum ar fi: MAXINT, MAXSHORT, MAXLONG, MINDOUBLE, MINFLOAT, etc.) care au ca valoare limitele inferioară şi superioară ale intervalului de valori pentru tipurile de date enumerate.  (de exemplu MAXINT reprezintă valoarea întregului maxim care se poate memora, etc. ) 

Fără a detalia foarte mult modul de reprezentare a datelor reale (de tip float sau double), vom sublinia faptul că, pentru acestea, este importantă şi precizia de reprezentare. Deoarece calculatorul poate reprezenta doar o submulţime finită de valori reale, în anumite cazuri, pot apare erori importante.

Numerele reale pot fi scrise sub forma:                     N = mantisa* bazaexponent

unde:baza reprezintă baza sistemului de numeraţie; mantisa (coeficientul) este un număr fracţionar normalizat ( în faţa virgulei se află 0, iar prima cifră de după virgulă este diferită de zero); exponentul este un număr întreg. Deoarece forma internă de reprezentare este binară, baza=2. În memorie vor fi reprezentate doar mantisa şi exponentul. Numărul de cifre de după virgulă determină precizia de exprimare a numărului. Ce alte cuvinte, pe un calculator cu o precizie de 6 cifre semnificative, două valori reale care diferă la a 7-a cifră zecimală, vor avea aceeaşi reprezentare. Pentru datele de tip float, precizia de reprezentare este 6; pentru cele de tip double, precizia este 14, iar pentru cele de tip long double, precizia este 20.

Lungimea zonei de memorie ocupate de o dată de un anumit tip (pe câţi octeţi este memorată data) poate fi aflată cu ajutorul operatorului sizeof.

Exemplu:

cout<<"Un int este memorat pe "<<sizeof(int)<<"octeti.\n";          

Instrucţiunea are ca efect afişarea pe monitor a mesajului: Un int este memorat pe 2 octeţi