Compartilhar via


Conversões aritméticas

Muitos operadores binários (discutidos em Expressões com operadores binários) provocam conversões de operandos e produzem resultados da mesma maneira. A forma como esses operadores provocam conversões é chamada "conversões aritméticas usuais". As conversões aritméticas de operandos de tipos nativos diferentes são executadas como mostra a tabela a seguir. Os tipos Typedef se comportam de acordo com seus tipos nativos subjacentes.

Condições para a conversão de tipos

Condições atendidas

Conversão

Qualquer um dos operandos é do tipo long double.

O outro operando é convertido no tipo long double.

A condição anterior não foi atendida e qualquer um dos operandos é do tipo double.

O outro operando é convertido no tipo double.

As condições anteriores não foram atendidas e qualquer um dos operandos é do tipo float.

O outro operando é convertido no tipo float.

As condições anteriores não foram atendidas (nenhum dos operandos é de tipo flutuante).

As promoções de integral são executadas nos operandos, da seguinte forma:

  • Se qualquer um dos operandos for do tipo unsigned long, o outro operando será convertido no tipo unsigned long.

  • Se a condição anterior não for atendida, qualquer um dos operandos for do tipo long e o outro for do tipo unsigned int, os dois operandos serão convertidos no tipo unsigned long.

  • Se as duas condições anteriores não forem atendidas e qualquer um dos operandos for do tipo long, o outro operando será convertido no tipo long.

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

  • Se nenhuma das condições anteriores for atendida, os dois operandos serão convertidos no tipo int.

O código a seguir ilustra as regras de conversão descritas na tabela:

// arithmetic_conversions.cpp
double dVal;
float fVal;
int iVal;
unsigned long ulVal;

int main() {
   // iVal converted to unsigned long
   // result of multiplication converted to double
   dVal = iVal * ulVal;

   // ulVal converted to float
   // result of addition converted to double
   dVal = ulVal + fVal;
}

A primeira instrução no exemplo acima mostra a multiplicação de dois tipos integrais, iVal e ulVal. A condição atendida é que nenhum dos operandos é de tipo flutuante e um operando é do tipo unsigned int. Portanto, o outro operando, iVal, é convertido no tipo unsigned int. O resultado é atribuído a dVal. A condição atendida é que um operando é do tipo double; portanto, o resultado unsigned int da multiplicação é convertido no tipo double.

A segunda instrução no exemplo acima mostra a adição de um tipo float e um integral, fVal e ulVal. A variável ulVal é convertida no tipo float (terceira condição na tabela). O resultado da adição é convertido no tipo double (segunda condição na tabela) e atribuído a dVal.

Consulte também

Referência

Conversões padrão