Ce face Conversii și cast
Când amesteci tipuri într-o expresie, C le convertește automat după niște reguli: tipurile mai mici decât int (char, short) devin int, iar dacă un operand este double, celălalt devine și el double. Între doi întregi, / face împărțire întreagă: 7 / 2 este 3.
Un cast (tip) expresie cere explicit conversia. Cel mai des îl folosești ca să obții împărțire cu zecimale: (double)suma / n. Castul se aplică doar operandului imediat următor, deci (double)(suma / n) ar face întâi împărțirea întreagă.
Conversia unui double la int taie zecimalele (spre zero): (int)3.99 este 3, iar (int)-3.99 este -3. Pentru rotunjire folosește round din math.h.
Exemple
Exemplul 1: Media notelor: împărțire întreagă vs. cu zecimale
Fără cast, suma / n este împărțire întreagă și pierde zecimalele. Cu (double)suma, împărțirea se face în double.
#include <stdio.h>
int main(void) {
int suma = 9 + 8 + 10 + 7;
int n = 4;
printf("fără cast: %d\n", suma / n);
printf("cast greșit: %.2f\n", (double)(suma / n));
printf("cu cast: %.2f\n", (double)suma / n);
return 0;
}
Rezultat
fără cast: 8
cast greșit: 8.00
cu cast: 8.50
Exemplul 2: Din double în int: zecimalele sunt tăiate
Conversia taie spre zero, nu rotunjește.
#include <stdio.h>
int main(void) {
double preturi[] = {3.99, 3.5, -3.99};
for (int i = 0; i < 3; i++) {
printf("%.2f -> %d\n", preturi[i], (int)preturi[i]);
}
return 0;
}
Rezultat
3.99 -> 3
3.50 -> 3
-3.99 -> -3
Exemplul 3: Promovarea la int și conversia la unsigned char
a + b se calculează în int, deci 200 + 100 dă 300. Pus înapoi într-un unsigned char (0–255), rezultatul devine 300 – 256 = 44.
#include <stdio.h>
int main(void) {
unsigned char a = 200, b = 100;
int suma = a + b;
unsigned char mic = (unsigned char)(a + b);
printf("în int: %d, în unsigned char: %d\n", suma, mic);
return 0;
}
Rezultat
în int: 300, în unsigned char: 44
Greșeli frecvente
- Scrii
double media = suma / n;cusumașinîntregi. Împărțirea se face înainte de atribuire, înint; pune castul pe un operand. - Folosești castul ca să scapi de un avertisment între tipuri de pointeri diferite. Avertismentul ascunde de obicei o greșeală reală.
- Convertești un
doubleprea mare (de exemplu 1e20) laint. Dacă valoarea nu încape, comportamentul este nedefinit.
Comenzi înrudite
Tipuri de date (int, char, double): Tipurile de bază din C: întregi (char, short, int, long, long long), cu sau fără semn, și numere reale (float, double).Operatori aritmetici (+ - * / % ++ --): Adunare, scădere, înmulțire, împărțire, restul împărțirii, atribuiri compuse și incrementare cu ++ / –.round, floor, ceil, trunc și fmod: Rotunjesc un număr real la întreg în moduri diferite și calculează restul împărțirii pentru numere reale.void * (pointer generic): Un pointer care poate păstra adresa oricărui tip de date, dar care trebuie convertit la un tip concret înainte de folosire.