Previous Next Up Index Contents

3.7.1. Les conversions de type automatiques


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.

Attention!

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 */


Exercice 3.8

Soient les déclarations:

   long  A = 15;
   char  B = 'A';        /* code ASCII : 65 */
   short C = 10;

Quels sont le type et la valeur de chacune des expressions:

   (1)   C + 3
   (2)   B + 1
   (3)   C + B
   (4)   3 * C + 2 * B
   (5)   2 * B + (A + 10) / C
   (6)   2 * B + (A + 10.0) / C


Previous Next Up Index Contents

Feedback - Copyright © 1993,1996,1997 F.Faber