Adloun

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 &lt;= INT8_MAX - y et non x + y &lt;= 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.