La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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.

Présentations similaires


Présentation au sujet: "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."— Transcription de la présentation:

1

2

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 ?

4 Il convertit le ou les opérandes et réalise ensuite laddition. Réponse

5 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 dun 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 lexpression suivant le return dans une fonction est différent du type de retour de la fonction. Le compilateur effectue une conversion de type quand …

6 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 dinformations. Types de conversions numériques

7 #include 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

8 SourceDestination unsigned charunsigned short int, short int, unsigned int, int, unsigned long int et long int unsigned short intunsigned int et unsigned long int unsigned intunsigned long int floatdouble et long double doublelong double Tableau des conversions intégrales

9 #include 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

10 SourceDestination signed charunsigned short int, short int, unsigned int, int, unsigned long int et long int. short intunsigned int, int, unsigned long int et long int. unsigned short intint et long int. intunsigned long int et long int. unsigned intlong int. Tableau des conversions conformes ou intégrales

11 #include 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

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

13 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;

14 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.

15 ÉTAPE 1 : Si un des opérandes est un long double, lautre est converti en long double ; Sinon, si un des opérandes est un double, lautre est converti en double ; Sinon, si un des opérandes est un float, lautre 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

16 ÉTAPE 2 : Si un des opérandes est un unsigned long int, lautre est converti en unsigned long int ; Sinon, si un des opérandes est un long int et lautre est un unsigned int : Si toute valeur dun unsigned int peut être placée dans un long int, lunsigned 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, lautre est converti en long int ; Sinon, si un des opérandes est un unsigned int, lautre est converti en unsigned int ; Sinon, on laisse les opérandes en int. Règles de conversion implicite binaire

17 Quelles conversions seront nécessaires pour évaluer lexpression ci-dessous ? 1.0 + 3 Type de lopérande de gauche : double Type de lopérande de droite : int Suivant la 2 ème règle de létape 1, lopérande de droite sera converti en double. Exemple

18 Quelles conversions seront nécessaires pour évaluer lexpression ci-dessous ? 3L * 10u Type de lopérande de gauche : long int Type de lopé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 dun 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

19 Conclusion Sil veut obtenir des résultats cohérents, un programmeur doit connaître le type des données quil utilise.

20 Pour plus dinformations, consultez Philippe Drix, Le langage C ANSI 3 ème édition, chapitre IV-10 FIN Merci au Service des Enseignements Généraux et à Hugues Saulnier


Télécharger ppt "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."

Présentations similaires


Annonces Google