Conversions arithmétiques habituelles
La plupart des opérateurs C effectuent des conversions de type pour apporter les opérandes d'une expression en un type commun ou étendre les valeurs courtes à la taille entière utilisée dans les opérations d'ordinateur.Les conversions exécutées par les opérateurs C dépendent de l'opérateur spécifique et du type de l'opérande ou des opérandes.Toutefois, de nombreux opérateurs exécutent les conversions similaires pour des opérandes les types intégraux et flottants.Ces conversions sont appelées « conversions arithmétiques. » La conversion d'une valeur d'opérande à un type compatible ne provoque pas modifier sa valeur.
Les conversions arithmétiques de synthèse ci-dessous sont appelées « les conversions arithmétiques habituelles. » Ces étapes sont appliquées uniquement pour les opérateurs binaires qui s'attendent au type arithmétique.L'objectif est de générer un type commun qui est également le type du résultat.Pour déterminer les conversions ont lieu en fait, le compilateur applique l'algorithme suivant aux opérations binaires dans l'expression.Les étapes ci-dessous ne sont pas d'ordre de préséance.
Si l'un des opérandes est de type long double, l'autre opérande est converti en type long double.
Si la condition ci-dessus n'est pas remplie et un des opérandes est de type double, l'autre opérande est converti en type double.
Si les deux conditions ci-dessus ne sont pas respectées et un des opérandes est de type float, l'autre opérande est converti en type float.
Si les trois conditions ci-dessus ne sont pas respectées (aucun des opérandes n'est des types de flottante), les conversions 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 ci-dessus n'est pas remplie et un des opérandes est de type long et l'autre du type unsigned int, les deux opérandes sont convertis en type unsigned long.
Si les deux conditions ci-dessus ne sont pas réunies, et l'un des opérandes est de type long, l'autre opérande est converti en type long.
Si les trois conditions ci-dessus ne sont pas réunies, et l'un des opérandes est de type unsigned int, l'autre opérande est converti en type unsigned int.
Si aucune des conditions ci-dessus n'est remplie, les deux opérandes sont convertis en type int.
Le code suivant illustre ces règles de conversion :
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
*/