19

Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Embed Size (px)

Citation preview

Page 1: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents
Page 2: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Question

Comment le compilateur fait-il pour évaluer une expression telle que :

A + Blorsque A et B sont des données de types arithmétiques différents ?

Page 3: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Il convertit le ou les opérandes et réalise ensuite l’addition.

Réponse

Page 4: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Le programmeur demande une conversion de type explicite (forçage de type) ;

Un opérande doit être converti en un autre type pour réaliser une opération arithmétique ;

Une valeur est affectée à un objet d’un type différent de la valeur à droite ;

Une valeur est passée à une fonction dont le paramètre formel est différent du type du paramètre effectif reçu ;

Le type de la valeur de l’expression suivant le return dans une fonction est différent du type de retour de la fonction.

Le compilateur effectue une conversion de type quand …

Page 5: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Intégrale : La valeur reste identique même si la combinaison de bits peut changer.

Conforme : La valeur change, mais on peut la reconstituer si on connaît le type original.

Dégradante : La valeur change et il y a perte d’informations.

Types de conversions numériques

Page 6: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

#include <stdlib.h>

int main(void){

/* Posons que la plage des unsigned*/

/* char va de 0 à 255. */unsigned char c = 100;

/* Posons que la plage des int va de*/

/* -32768 à 32767. */int nb;

nb = c; /* Conversion intégrale. */

return EXIT_SUCCESS;}

Exemple de conversion intégrale

Page 7: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Source Destinationunsigned char unsigned short int, short int,

unsigned int, int, unsigned long int et long int

unsigned short int unsigned int et unsigned long int

unsigned int unsigned long int

float double et long double

double long double

Tableau des conversions intégrales

Page 8: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

#include <stdlib.h>

int main(void){

/* Posons que la plage des int va *//* de -32768 à 32767.*/int nb1 = -5;

/* Posons que la plage des unsigned*//* long va de 0 à 4 294 967 295. */unsigned long nb2;

nb2 = nb1;/* Conversion conforme. */

return EXIT_SUCCESS;}

Exemple de conversion conforme

Page 9: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Source Destinationsigned char unsigned short int, short int,

unsigned int, int, unsigned long int et long int.

short int unsigned int, int, unsigned long int et long int.

unsigned short int int et long int.

int unsigned long int et long int.

unsigned int long int.

Tableau des conversions conformes ou intégrales

Page 10: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

#include <stdlib.h>

int main(void){

/* Supposons que la plage des long *//* est -2 147 483 648…2 147 483 647.*/unsigned long nb = 50000;

/* Supposons que la plage des char *//* est -128…127.*/char c;

c = nb; /* Conversion dégradante.*/

return EXIT_SUCCESS;}

Exemple de conversion dégradante

Page 11: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Toute autre conversion qui ne se trouve pas dans les deux tableaux précédents peut être dégradante.

Tableau des conversions dégradantes

Page 12: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Définition de conversion implicite

On nomme « conversion de type implicite » une conversion de type réalisée par le compilateur sans une demande explicite du programmeur.

Voici deux exemples :

/* On affecte un int à un double. */double nb = ‘a’;

/* On affecte un double à un int. */int nb2 = 1.0;

Page 13: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Mécanisme de promotion entière

Les signed char, unsigned char, short int et unsigned short int sont toujours convertis implicitement en entier.

Plus précisément, en int si celui-ci peut représenter toutes les valeurs possibles du type original et en unsigned int sinon.

Page 14: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

ÉTAPE 1 :

Si un des opérandes est un long double, l’autre est converti en long double ;

Sinon, si un des opérandes est un double, l’autre est converti en double ;

Sinon, si un des opérandes est un float, l’autre est converti en float ;

Sinon, on effectue la promotion entière des deux opérandes et on continue à l’étape 2.

Règles de conversion implicite binaire

Page 15: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

ÉTAPE 2 : Si un des opérandes est un unsigned long int, l’autre

est converti en unsigned long int ; Sinon, si un des opérandes est un long int et l’autre

est un unsigned int : Si toute valeur d’un unsigned int peut être placée dans un

long int, l’unsigned int est converti en long int ; Sinon, les deux opérandes sont convertis en unsigned long

int ; Sinon, si un des opérandes est un long int, l’autre est

converti en long int ; Sinon, si un des opérandes est un unsigned int,

l’autre est converti en unsigned int ; Sinon, on laisse les opérandes en int.

Règles de conversion implicite binaire

Page 16: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Quelles conversions seront nécessaires pour évaluer l’expression ci-dessous ?

1.0 + 3

Type de l’opérande de gauche : double

Type de l’opérande de droite : int

Suivant la 2ème règle de l’étape 1, l’opérande de droite sera converti en double.

Exemple

Page 17: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Quelles conversions seront nécessaires pour évaluer l’expression ci-dessous ?

3L * 10u

Type de l’opérande de gauche : long int

Type de l’opérande de droite : unsigned intÇa dépend! En VC++, parce que le int prend 4 octets et le long int aussi, toutes les valeurs d’un unsigned int ne peuvent pas être représentées par un long int. Ainsi, les deux opérandes seront convertis en unsigned long int.

Exemple

Page 18: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Conclusion

S’il veut obtenir des résultats cohérents, un programmeur doit connaître le type des données qu’il utilise.

Page 19: Question Comment le compilateur fait-il pour évaluer une expression telle que : A + B lorsque A et B sont des données de types arithmétiques différents

Pour plus d’informations, consultez

Philippe Drix, Le langage C ANSI 3ème édition, chapitre IV-10FINMerci au

Service des Enseignements Généraux

et à

Hugues Saulnier