Conversii și cast în C

Conversiile automate dintre tipuri și cum forțezi o conversie cu (tip): de exemplu împărțire cu zecimale între două întregi.

Sintaxă
(tip) expresie
double media = (double)suma / n;

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; cu suma și n întregi. Împărțirea se face înainte de atribuire, în int; 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 double prea mare (de exemplu 1e20) la int. Dacă valoarea nu încape, comportamentul este nedefinit.

Comenzi înrudite