Um guia visual dos operadores aritméticos de C (+, -, *, /, %), conversão implícita de tipo e casts.
+ - * / para aritmética, % para resto*// têm maior precedência que +/-( ) para mudar a ordem de precedência7/2 dá 3, não 3.5.int e double, o int é automaticamente promovido a double. Isso é conversão implícita.int a = 7; double b = 2.0; double result = a / b; // a é promovido automaticamente para double → 7.0 / 2.0 = 3.5
double, o resultado é double. Só quando os dois lados são int é que você tem divisão inteira (truncada).(tipo destino) antes de uma expressão a converte temporariamente para esse tipo. Isso se chama cast.int a = 7, b = 2; // Sem cast → divisão inteira printf("%d\n", a / b); // 3 (truncado) // Com cast → ponto flutuante printf("%f\n", (double)a / b); // 3.500000
(tipo) expressãoint x = 5; double d = (double)x; // 5.0
double d = 3.7; int n = (int)d; // 3 (parte fracionária truncada)
int sum = 17, n = 3; double avg = (double)sum / n; // 5.666...
(double)(sum / n) faz primeiro a divisão inteira (sum / n = 5) e só depois converte o 5 para 5.0.| Situação | Código | Por quê |
|---|---|---|
| Divisão inteira, mas você quer resultado em ponto flutuante | (double)a / b | Forçar um lado a ser double para ter divisão em ponto flutuante |
| Calculando uma média | (double)sum / count | Evitar a truncagem do int / int |
| Valor de retorno do malloc | (int *)malloc(...) | Converter void* para o tipo de ponteiro adequado |
| Truncar um float em direção ao zero | (int)3.7 → 3 | Descartar a parte fracionária |
| Tratar um char como número | (int)'A' → 65 | Obter o código ASCII |
int a = 10, b = 3; printf("A: %d\n", a / b); printf("B: %f\n", (double)a / b); printf("C: %f\n", (double)(a / b));
int / int = int → 10/3 = 3 (truncado).(double)a / b → 10.0 / 3 = 3.333333 (o cast acontece antes da divisão, então é em ponto flutuante).(double)(a / b) → (double)(3) = 3.000000 (a divisão inteira acontece primeiro — a posição do cast faz diferença!)
% (resto) para testar se um número é par ou ímpar7/2 trunca para 3 quando os dois operandos são intdoubleTeste seu entendimento desta aula!
int / int descarta a parte fracionária, então 7 / 2 = 3.
% é o operador de resto (módulo). 7 / 2 é 3 com resto 1, então o resultado é 1.
Fazer cast para (double) força divisão em ponto flutuante: 5.0 / 2 = 2.5.