Cours 3.4. Les conversion de type forcé

Comme nous venons de le voir au cours précédent, le processeur ne peut réaliser des opérations que sur des variables de même type. En programmation, nous pouvons être amenés à réaliser des calculs sur des variables de types différents ou espérer un résultat de type différent. Par exemple, il pourrait être nécessaire d'obtenir un flottant comme résultat de la division de deux entiers :

int a = 5;
int b = 10;

printf ("5 / 10 = %f\n", a / b);

L'exemple ci-dessus ne fonctionne pas comme espéré :

Conversion de type implicite

Quand la conversion de type est réalisée automatiquement par le compilateur sans que la conversion soit mentionnée explicitement dans le code, on parle de conversion de type implicite. Il s'agit d'une conversion temporaire, car la conversion de type ne se fait que pendant l'instruction où elle est invoquée. Voici un exemple de la division d'un flottant par un entier. Le compilateur est contraint de convertir l'une des deux variables dans l'autre type. Ici c'est l'entier qui va être converti en flottant :

float a = 5;
int b = 10;

// Ici, il y a une conversion de type implicite
printf ("5 / 10 = %f\n", a / b);

Si vous ne connaissez pas les règles de conversion automatique, ou si vous n'êtes pas certain du comportement, utilisez les conversions de type explicites.

Conversion de type explicite

La conversion de type explicite consiste à stipuler dans le code la variable concernée et le type de destination. Ici, nous allons explicitement convertir les variables a et b du type int vers le type double. Comme précédemment la conversion est temporaire. Elle n'est effective que pendant l'instruction où elle est invoquée : Après le calcul, les variables redeviendront de type int. On dit que l'on caste la variable (de l'anglais casting). Dans l'exemple ci-dessous, nous allons caster les variables a et b en double :

int a = 5;
int b = 10;

// On caste les variable a et b pour le calcul
printf ("%f", (double)a / (double)b);

Caster une variable se fait simplement en précisant le type de destination avant la variable entre parenthèses. Les variable a et b sont castées en double.

La conversion de type explicite peut être réalisée sur

Exercices

Exercice 1

Le programme ci-dessous calcule la moyenne de 3 notes, mais le résultat affiché n'est pas celui escompté. Corrigez le programme afin d'obtenir la moyenne non arrondie en utilisant une conversion de type explicite:

int note1=12;
int note2=14;
int note3=15;

// Modifier cette ligne pour que le calcul soit exacte
// Utilisez une conversion de type explicite
float moyenne = (note1 + note2 + note3)/3;

// affiche la moyenne
printf ("Moyenne = %f", moyenne);

Exercice 2

En reprenant le code initial de l'exercice 1, corrigez le programme en utilisant cette fois-ci une conversion de type implicite :

int note1=12;
int note2=14;
int note3=15;

// Modifier cette ligne pour que le calcul soit exacte
// Utilisez une conversion de type implicite
float moyenne = (note1 + note2 + note3)/3;

// affiche la moyenne
printf ("Moyenne = %f", moyenne);

Quiz

Qu'est-ce qu'une conversion de type implicite ?

Vérifier Bravo ! Une conversion de type implicite est réalisée automatiquement et temporairement par le compilateur. Essaie encore ...

Qu'est-ce qu'une conversion de type explicite ?

Vérifier Bravo ! Une conversion de type explicite est temporaire, mais explicitement spécifiée dans le code. Essaie encore ...

Quelle est la syntaxe qui permet une conversion de type explicite ?

Vérifier Bravo ! Le cast se fait en précisant le type cible entre parenthèses juste avant la variable concernée. Essaie encore ...

Il est possible de caster ...

Vérifier Bravo ! Un opérande ne peut être qu'une constante, un résultat ou une variable. Essaie encore ...

Considérons les variables ci-dessous :

int a = 3;
int b = 6;

Corrigez ce calcul pour que le résultat soit exact :

float x = (a + b) / 5;
Vérifier Bravo ! Dans la dernière réponse, le résultat est arrondi avant la conversion de type. Au moment du cast, la précision est déjà perdue. Essaie encore ...

Voir aussi


Dernière mise à jour : 21/11/2022