Conversões aritméticas normais
A maioria dos operadores C executam conversões de tipos para avançar os operandos de uma expressão para um tipo comum ou estender valores resumidos para o tamanho do inteiro usado em operações do computador. As conversões realizadas por operadores C dependem do operador específico e do tipo dos operandos. Porém, muitos operadores executam conversões semelhantes em operandos dos tipos integral e flutuante. Essas conversões são conhecidas como "conversões aritméticas". A conversão de um valor de operando em um tipo compatível não causa alterações em seu valor.
As conversões aritméticas resumidas abaixo são chamadas de "conversões aritméticas normais". Essas etapas são aplicadas somente em operadores binários que esperam tipo aritmético. A finalidade é gerar um tipo comum que também seja o tipo do resultado. Para determinar quais conversões ocorrem realmente, o compilador aplica o seguinte algoritmo a operações binárias à expressão. As etapas abaixo não são uma ordem de precedência.
Se qualquer operando for do tipo
long double
, o outro operando será convertido ao tipolong double
.Se a condição acima não for atendida e um dos operandos for do tipo
double
, o outro operando será convertido ao tipodouble
.Se as duas condições anteriores não forem atendidas e um dos operandos for do tipo
float
, o outro operando será convertido ao tipofloat
.Se as três condições anteriores não forem atendidas (nenhum dos operandos é dos tipos flutuantes), as conversões integrais são executadas nos operandos como segue:
Se qualquer operando for do tipo
unsigned long
, o outro operando será convertido ao tipounsigned long
.Se a condição acima não for atendida e um dos operandos for do tipo
long
e o outro do tipounsigned int
, os dois operandos serão convertidos ao tipounsigned long
.Se as duas condições acima não forem atendidas e um dos operandos for do tipo
long
, o outro operando será convertido ao tipolong
.Se as três condições anteriores não forem atendidas e qualquer operando for do tipo
unsigned int
, o outro operando será convertido ao tipounsigned int
.Se nenhuma das condições anteriores forem atendidas, os dois os operandos serão convertidos ao 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
*/