Un dépassement qui ne dit rien
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 1 — Le langage C
É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.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.