Calculs et affectations
Si un opérateur a des opérandes de différents types, les valeurs des opérandes sont converties automatiquement dans un type commun.
Ces manipulations implicites convertissent en général des types
plus 'petits' en des types plus 'larges'; de cette façon on ne perd pas
en précision.
Lors d'une affectation, la donnée à droite du signe d'égalité est convertie dans le type à gauche du signe d'égalité. Dans ce cas, il peut y avoir perte de précision si le type de la destination est plus faible que celui de la source.
Exemple
Considérons le calcul suivant:
int I = 8; float X = 12.5; double Y; Y = I * X;
Pour pouvoir être multiplié avec X, la valeur de I est convertie en float (le type le plus large des deux). Le résultat de la multiplication est du type float, mais avant d'être affecté a Y, il est converti en double. Nous obtenons comme résultat:
Y = 100.00
Appels de fonctions
Lors de l'appel d'une fonction, les paramètres sont automatiquement convertis dans les types déclarés dans la définition de la fonction.
Exemple
Au cours des expressions suivantes, nous assistons à trois conversions automatiques:
int A = 200; int RES; RES = pow(A, 2);
A l'appel de la fonction pow, la valeur de A et la constante 2 sont converties en double, parce que pow est définie pour des données de ce type. Le résultat (type double) retourné par pow doit être converti en int avant d'être affecté à RES.
Règles de conversion automatique
Conversions automatiques lors d'une opération avec,
(1) deux entiers:
D'abord, les types char et short sont convertis en int. Ensuite, l'ordinateur choisit le plus large des deux types dans l'échelle suivante:
int, unsigned int, long, unsigned long
(2) un entier et un rationnel: Le type entier est converti dans le type du rationnel.
(3) deux rationnels: L'ordinateur choisit le plus large des deux types selon l'échelle suivante:
float, double, long double
(4) affectations et opérateurs d'affectation: Lors d'une affectation, le résultat est toujours converti dans le type de la destination. Si ce type est plus faible, il peut y avoir une perte de précision.
Exemple
Observons les conversions nécessaires lors d'une simple division:
int X; float A=12.48; char B=4; X=A/B;
B est converti en float (règle 2). Le résultat de la division est du type float (valeur 3.12) et sera converti en int avant d'être affecté à X (règle 4), ce qui conduit au résultat X=3 .
Phénomènes imprévus ...
Le mélange de différents types numériques dans un calcul peut inciter à ne pas tenir compte des phénomènes de conversion et conduit parfois à des résultats imprévus ...
Exemple
Dans cet exemple, nous divisons 3 par 4 à trois reprises et nous observons que le résultat ne dépend pas seulement du type de la destination, mais aussi du type des opérandes.
char A=3; int B=4; float C=4; float D,E; char F; D = A/C; E = A/B; F = A/C;
* Pour le calcul de D, A est converti en float (règle 2) et divisé par C. Le résultat (0.75) est affecté à D qui est aussi du type float. On obtient donc: D=0.75
* Pour le calcul de E, A est converti en int (règle 1) et divisé par B. Le résultat de la division (type int, valeur 0) est converti en float (règle 4). On obtient donc: E=0.000
* Pour le calcul de F, A est converti en float (règle 2) et divisé par C. Le résultat (0.75) est retraduit en char (règle 4). On obtient donc: F=0
Perte de précision
Lorsque nous convertissons une valeur en un type qui n'est pas assez précis ou pas assez grand, la valeur est coupée sans arrondir et sans nous avertir ...
Exemple
unsigned int A = 70000; /* la valeur de A sera: 70000 mod 65536 = 4464 */Retour Suite Index