Limitele care trebuie știute
| Tip | Dimensiune | Interval aproximativ |
|---|---|---|
int | 4 octeți | (exact ) |
long long | 8 octeți | |
char | 1 octet | un caracter (codul 0-255 / -128..127) |
double | 8 octeți | reale, ~15 cifre semnificative |
Regula practică: peste ~2 miliarde → long long; numărul de cifre al lui n! sau produse mari → tot long long sau regândirea algoritmului.
Overflow: ce se întâmplă la depășire
Depășirea lui int NU dă eroare la rulare: valoarea "se înfășoară" (comportament de aritmetic modular), rezultatul devine absurd, adesea NEGATIV.
Exemplu clasic. int a = 2000000000; a + a nu dă 4 miliarde, ci un număr negativ: 4·10⁹ nu încape în int.
Capcana subtilă: produsul a doi int
#include <iostream>
using namespace std;
int main() {
int a = 100000, b = 100000;
long long gresit = a * b;
cout << gresit;
return 0;
}Atenție: Singurul loc din lectii unde cele patru limbaje dau intentionat rezultate diferite, fiindca despre asta e lectia. In C si C++ inmultirea se face intre doi int si depaseste tipul INAINTE de a fi pusa in variabila mare, deci iese 1410065408. Pascal ridica automat calculul la int64 si da rezultatul corect, iar Python nu are nicio limita la intregi. Deci aceeasi greseala de gandire se pedepseste in C si C++, dar trece nepedepsita in celelalte doua.
GREȘIT: a * b se calculează ÎN int (overflow), abia apoi se copiază în long long. Corect:
#include <iostream>
using namespace std;
int main() {
int a = 100000, b = 100000;
long long corect = 1LL * a * b;
cout << corect;
return 0;
}Atenție: Inmultirea cu 1LL in C si C++, sau conversia la int64 in Pascal, forteaza calculul sa se faca de la inceput pe tipul mare. In Python nu e nevoie de nimic.
Sufixul 1LL forțează calculul pe 64 de biți de la primul pas.
double: capcana comparării
Realele se reprezintă aproximativ: 0.1 + 0.2 == 0.3 e FALS în C++. Comparațiile de reale se fac cu toleranță: fabs(x - y) < 1e-9.
Greșeli frecvente
- Suma a n numere de până la 10⁹: pentru n ≥ 3 rezultatul cere long long.
long long p = a * bcu a, b int NU te salvează: conversia vine prea târziu.- La double, egalitatea strictă e nesigură: folosește toleranță.