Adloun

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

Le cours du chapitre · Tous les exercices du chapitre