Nu știu cât știi, dar am să încerc să fiu de folos.
În limbajele C/C++ există tipurile de date primitive care le-a enumerat și andreiandreiq. Practic, tipurile de date precizează cât spațiu ocupă o variabilă în memorie și cum va fi reprezentată valoarea variabilei în memorie.
O variabilă este un nume de locație din memorie. Poți să te gândești în felul următor. Memoria este o stradă lungă (unidimensională) cu case. Fiecare casă are o adresă.
În memoria calculatorului, unitatea de măsură cea mai mică a memoriei este byte-ul (care esta format din 8 biți - șir de 0 și 1). Asta ar însemna că într-o casă intră 8 biți iar adresele caselor merg din 8 în 8 biți. Presupun că știi că numerele din baza 10 sunt reprezentate în binar în calculator - deci practic, calculatoarele lucrează DOAR cu numere - în baza 2.
Să vedem ce se întâmplă când facem următorul lucru:
- char variabila_mea = 65;
- printf("%c", variabila_mea);
- printf("%d", variabila_mea);
- printf("%p", &variabila_mea);
În exemplul de mai sus
variabila_mea este de tip char. Întâmplător, tipul char ocupă 8 biți (sau un byte). Asta înseamnă că mulțimea valorilor pe care
variabila_mea le poate lua sunt în intervalul [0,255] (

).
Funcția
printf din C ne ajută la afișare în consolă. Ea are forma următoare:
- printf("string pentru formatarea variabilelor", v1, v2, v3 ...);
Unde: stringul pentru formatarea variabilelor are rolul de a afișa conținutul variabilelor într-o anumită manieră, iar v1, v2, v3 ... sunt variabilele care urmează să fie afișate corespunzător. Mai multe detalii și exemple despre printf poți găsi
aici.
În interiorul variabila_mea se află valoarea 65. În biți ar arăta 01000001. Acești biți sunt plasați la adresa la care se află
variabila_mea.
Primul printf are ca string de formatare specificatorul %c. Acesta spune funcției să afișeze conținutul din variabila_mea ca un caracter.
De aici și vine numele %
c - de la
char. Pe ecran va fi afișată litera "A". De ce?
Am spus mai devreme că calculatoarele lucrează cu numere. Astfel, pentru a putea lucra și cu caractere, s-a introdus un standard care a atribuit unui număr, un anumit caracter. Există mai multe standarde de genul acesta, dar noi vom vorbi despre ASCII. În codul ascii, numărului 65 este atribuit caracterul "A". Pentru a vedea tot tabelul, poți da un ochi aici:
http://www.asciitable.com/.
ASCII suportă 256 de caractere (de la 0 la 255) deci, cât să încapă pe un byte - 8 biți (adică char-ul nostru).
Al doilea printf folosește specificatorul %
d - care vine de la
decimal. Astfel, se va afișa valoarea 65 pe ecran sub formă de număr în baza 10 (chiar dacă noi am spus că
variabila_mea este de tip char - am trecut cu vederea peste acest fapt și i-am spus funcției printf să se uite la
variabila_mea cu "alți ochi" - adică să se uite la
variabila_mea ca la un număr simplu).
În ultimul printf am pus operatorul & în față la
variabila_mea. Acesta returnează ADRESA la care se află
variabila_mea. Specificatorul %p spune funcției că urmează să se afișeze un pointer - adică o adresă. Pe ecran se va afișa o valoare
aproape aleatorie în baza 16 care reprezintă adresa unde se află variabila_mea.
Același lucru putem să facem cu un
int sau orice altă variabilă de alt tip de date. Dacă vrem să vedem care este dimensiunea pe ca le ocupă variabilele noastre în memorie putem folosi operatorul unar
sizeof. Tipurile de date am mărimi diferite în funcție de compilator, sistemul de operare, mașina pe care rulezi etc. Astfel, valorile prezentate mai sus de
andreiandreiq pot fi diferite pe sistemul tău. Dacă dimensiunea pe care o ocupă un anumit tip de date primitiv diferă, înseamnă că valorile pe care acesta le poate cuprinde diferă de asemenea.
Iată un exemplu de cod:
- #include <cstdio>
-
- int main() {
-
- char my_char = 65; // echivalentu cu char c = 'A';
- int my_int = 10;
- float my_float = 12345.643;
- double my_double = 98763.1234;
-
-
- printf("char-ul ocupa %d bytes\n", sizeof(my_char));
- printf("int-ul ocupa %d bytes\n", sizeof(my_int));
- printf("float-ul ocupa %d bytes\n", sizeof(my_float));
- printf("double-ul ocupa %d bytes\n", sizeof(my_double));
-
- printf("\nEchivalent cu:\n\n");
-
- printf("char-ul ocupa %d bytes\n", sizeof(char));
- printf("int-ul ocupa %d bytes\n", sizeof(int));
- printf("float-ul ocupa %d bytes\n", sizeof(float));
- printf("double-ul ocupa %d bytes\n", sizeof(double));
-
- return 0;
- }
Rezultatul pe sistemul meu este următorul:
- char-ul ocupa 1 bytes
- int-ul ocupa 4 bytes
- float-ul ocupa 4 bytes
- double-ul ocupa 8 bytes
-
- Echivalent cu:
-
- char-ul ocupa 1 bytes
- int-ul ocupa 4 bytes
- float-ul ocupa 4 bytes
- double-ul ocupa 8 bytes
-
Folosind formula
int-ul poate lua

valori. Adică 4294967296.
Acuma este o problemă. Care-i treaba cu semnul numerelor? Cum facem să avem numere cu semna sau fără semn?
Păi se folosește primul bit de semn - dacă el este 1 înseamnă că numărul este negativ, iar dacă este 0 numărul este pozitiv. Ar fi multe lucruri de discutat dar treburile astea ar trebui să le faci la facultate la limbaje de asamblare, bazele matematice ale calculatoarelor sau ceva materie dinasta.
Când noi zicem:
Se produce un int cu semn. Adică pe mașina mea ia valori în intervalul [-2147483648, 2147483647] - în total sunt 4294967296, cum am calculat cu formula.
Dacă hotărâm că nu avem nevoie de numere negative putem zice:
Se produce un int fără semn care poate lua valori în intervalul [0, 4294967295] - în total 4294967296 valori.
Codul următor folosește librăria
climits -despre care poti să citesti mai mult
aici.
- #include <cstdio>
- #include <climits>
-
- int main() {
-
- printf("%d \n", CHAR_MAX);
- printf("%d \n", CHAR_MIN);
- printf("%d \n", INT_MAX);
- printf("%d \n", INT_MIN);
-
- printf("%u \n", UCHAR_MAX);
- printf("%u \n", UINT_MAX);
-
- return 0;
- }
Rezultatul pe mașina mea:
- 127
- -128
- 2147483647
- -2147483648
- 255
- 4294967295
Despre tipuri de date cu virgulă mobilă nu am să vorbesc că este mai complicat și nici la noi la facultate nu a insistat prea mult - prezentând doar puțin teoria din spate. Dacă te interesează limitele acestori tipuri de date poți intra
aici.
De asemenea, dacă te interesează să știi mai multe despre variabile și tipuri de date, poți citi
tutorialul acesta. Dacă știi engleză și vrei să înveti bine C++, îți recomand
tot tutorialul.