Partilhar via


Conversões aritméticas usuais

A maioria dos operadores C executa conversões de tipo para trazer os operandos de uma expressão para um tipo comum ou para estender valores curtos para o tamanho inteiro usado em operações de máquina. As conversões realizadas pelos operadores C dependem do operador específico e do tipo de operando ou operandos. No entanto, muitos operadores executam conversões semelhantes em operandos de tipos integrais e flutuantes. Essas conversões são conhecidas como "conversões aritméticas". A conversão de um valor de operando para um tipo compatível não causa nenhuma alteração em seu valor.

As conversões aritméticas resumidas abaixo são chamadas de "conversões aritméticas usuais". Essas etapas são aplicadas somente para operadores binários que esperam o tipo aritmético. O objetivo é produzir um tipo comum que também é o tipo do resultado. Para determinar quais conversões realmente ocorrem, o compilador aplica o seguinte algoritmo a operações binárias na expressão. As etapas abaixo não são uma ordem de precedência.

  1. Se um operando for do tipo long double, o outro operando será convertido em tipo long double.

  2. Se a condição acima não for atendida e qualquer operando for do tipo double, o outro operando será convertido em tipo double.

  3. Se as duas condições acima não forem atendidas e qualquer operando for do tipo float, o outro operando será convertido em tipo float.

  4. Se as três condições acima não forem atendidas (nenhum dos operandos é de tipos flutuantes), as conversões integrais serão realizadas nos operandos da seguinte maneira:

    • Se um operando for do tipo unsigned long, o outro operando será convertido em tipo unsigned long.

    • Se a condição acima não for atendida e um operando for do tipo long e o outro do tipo unsigned int, ambos os operandos serão convertidos em tipo unsigned long.

    • Se as duas condições acima não forem atendidas, e qualquer operando for do tipo long, o outro operando será convertido em tipo long.

    • Se as três condições acima não forem atendidas, e qualquer operando for do tipo unsigned int, o outro operando será convertido em tipo unsigned int.

    • Se nenhuma das condições acima for atendida, ambos os operandos serão convertidos em tipo int.

O código a seguir ilustra essas regras de conversão:

float   fVal;
double  dVal;
int   iVal;
unsigned long ulVal;

dVal = iVal * ulVal; /* iVal converted to unsigned long
                      * Uses step 4.
                      * Result of multiplication converted to double
                      */
dVal = ulVal + fVal; /* ulVal converted to float
                      * Uses step 3.
                      * Result of addition converted to double
                      */

Ver também

Operadores C