informatique (MP2I/MPI) · Chapitre 1 · Application directe du cours
Un dépassement qui ne dit rien
Le langage C · niveau 2
Énoncé
Quelle valeur affiche ce programme ? Pourquoi ?
int8_t x = 100;
int8_t y = 100;
int8_t s = x + y;
printf("%d\n", s);Corrigé
Il affiche .
La somme vaut , calculée en int — les opérandes de petite taille sont promus. Mais l'affectation dans un int8_t, qui vit entre et , tronque le résultat sur bits : , et ce motif interprété en complément à deux vaut .
Aucun avertissement à l'exécution, et gcc -Wall lui-même reste silencieux sur ce cas. C'est au programmeur de vérifier :
assert(x <= INT8_MAX - y); /* la somme tiendra-t-elle ? */
int8_t s = x + y;
Noter la forme du test : on écrit x <= INT8_MAX - y et non x + y <= INT8_MAX, car cette seconde écriture déborderait elle-même avant d'être testée.
Exercices semblables
- Lire un type corrigé
- Passage par valeur corrigé
- La taille d'une chaîne corrigé
- Lire une déclaration corrigé
- Problème — Une chaîne sûre corrigé