Conversões aritméticas usuais
A maioria dos operadores c executam conversões de tipo para trazer os operandos de uma expressão para um tipo comum ou estender a valores curtos para o tamanho inteiro usado nas operações de máquina.As conversões realizadas por operadores c dependem do operador específico e o tipo do operando ou operandos.Entretanto, muitos operadores realizar conversões semelhantes em operandos de tipos integrais e flutuantes.Essas conversões são conhecidos como "conversões aritméticas". Conversão de um valor do operando em um tipo compatível causa sem alterar 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 os operadores binários que esperam o tipo de 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 algoritmo a seguir para operações binárias na expressão.As etapas a seguir não são uma ordem de precedência.
Se qualquer operador for do tipo long double, o outro operando é convertido no tipo long double.
Se a condição acima não for atendida e qualquer operador for do tipo double, o outro operando é convertido no tipo double.
Se as duas condições acima não forem atendidas e qualquer operador for do tipo float, o outro operando é convertido no tipo float.
Se as três condições acima não forem atendidas (nenhum dos operandos são de tipos de flutuantes), e em seguida, integrais conversões são realizadas em operandos da seguinte maneira:
Se qualquer operador for do tipo unsigned long, o outro operando é convertido no tipo unsigned long.
Se a condição acima não for atendida e qualquer operador for do tipo longo e o outro do tipo unsigned int, ambos os operandos são convertidos para o tipo unsigned long.
Se as duas condições acima não forem atendidas, e qualquer operador for do tipo longo, o outro operando é convertido no tipo longo.
Se as três condições acima não forem atendidas, e qualquer operador for do tipo unsigned int, o outro operando é convertido no tipo unsigned int.
Se nenhuma das condições acima forem atendidas, ambos os operandos são convertidos para o 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
*/