Partager via


Conversions arithmétiques

De nombreux opérateurs binaires (présentés dans Expressions avec des opérateurs binaires) effectuent les conversions d'opérandes et génèrent les résultats de la même façon. La façon dont ces opérateurs effectuent les conversions s'appelle « conversions arithmétiques habituelles ». Les conversions arithmétiques des opérandes de différents types natifs sont exécutées comme indiqué dans le tableau suivant. Les types typedef se comportent selon leurs types natifs sous-jacents.

Conditions pour la conversion de type

Conditions remplies

Conversion

L'un des opérandes est du type long double.

L'autre opérande est converti en type long double.

Condition précédente non remplie et l'un des opérandes est de type double.

L'autre opérande est converti en type double.

Conditions précédentes non remplies et l'un des opérandes est de type float.

L'autre opérande est converti en type float.

Conditions précédentes non remplies (aucun des opérandes n'est de type flottant).

Les promotions intégrales sont exécutées sur les opérandes comme suit :

  • Si l'un des opérandes est de type unsigned long, l'autre opérande est converti en type unsigned long.

  • Si la condition précédente n'est pas remplie et que l'un des opérandes est de type long et l'autre de type unsigned int, les deux opérandes sont convertis en type unsigned long.

  • Si les deux conditions précédentes ne sont pas réunies et que l'un des opérandes est de type long, l'autre opérande est converti en type long.

  • Si les trois conditions précédentes ne sont pas réunies et que l'un des opérandes est de type unsigned int, l'autre opérande est converti en type unsigned int.

  • Si aucune des conditions précédentes n'est remplie, les deux opérandes sont convertis en type int.

Le code suivant illustre les règles de conversion décrites dans le tableau :

// 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;
}

Dans l'exemple précédent, la première instruction affiche la multiplication de deux types intégraux, iVal et ulVal. La condition remplie est que ni l'un ni l'autre opérande n'est de type flottant et qu'un opérande est de type unsigned int. Par conséquent, l'autre opérande, iVal, est converti en type unsigned int. Le résultat est assigné à dVal. La condition remplie est qu'un opérande est de type double. Par conséquent, le résultat unsigned int de la multiplication est converti en type double.

Dans l'exemple précédent, la deuxième instruction montre l'ajout d'un type float et d'un type intégral, fVal et ulVal. La variable ulVal est convertie en type float (troisième condition dans le tableau). Le résultat de l'addition est converti en type double (seconde condition dans le tableau) et assigné à dVal.

Voir aussi

Référence

Conversions standard