L'idée de base : l'odomètre
Dans la plupart des langages et dans le matériel de l'ordinateur, un entier occupe un nombre fixe de bits : 8, 16, 32 ou 64. Comme l'odomètre d'une vieille voiture qui affiche 99 999 km : un kilomètre de plus et il retombe à 00 000.
Avec 16 bits signés, on peut compter de -32768 à +32767. Ajoute 1 à 32767 et... tu obtiens -32768. Le compteur a débordé (en anglais : overflow) : le programme continue de tourner, mais avec un nombre qui n'a plus aucun sens.
| Boîte | Plus petit | Plus grand |
|---|---|---|
| 8 bits signés | -128 | 127 |
| 16 bits signés | -32 768 | 32 767 |
| 32 bits signés | -2 147 483 648 | 2 147 483 647 |
Démo : fais déborder le compteur
Choisis la taille de la boîte, puis avance le compteur. Regarde les bits se remplir de 1... et ce qui arrive au moment où tout bascule. Le premier bit (en rouge) est le bit de signe.
Odomètre binaire
Et en Python ?
Bonne nouvelle : les int de Python grandissent autant qu'il faut, ils ne débordent jamais.
Mais le piège revient vite, dès qu'on sort du Python pur :
import numpy compteur = numpy.int16(32767) print(compteur + numpy.int16(1)) # -32768 (débordé, sans message clair !)Les tableaux NumPy, les fichiers binaires, les capteurs, les bases de données et presque tous les autres langages (C, Java, JavaScript...) utilisent des boîtes de taille fixe. Le float aussi a ses bords : trop grand, il devient inf.
Histoire vraie : Ariane 5, le débordement à 370 millions
Trente-sept secondes après le décollage, la toute première Ariane 5 bascule et s'autodétruit. La cause : un programme recopié d'Ariane 4 convertissait la vitesse horizontale d'un float 64 bits vers un entier 16 bits. Ariane 5 accélérait plus fort que sa grande sœur, la valeur a dépassé 32 767... et le nombre a débordé. L'ordinateur de bord, perdu, a braqué les tuyères à fond.
Autres classiques du genre : le bug de l'an 2038 (les secondes comptées sur 32 bits depuis 1970 déborderont le 19 janvier 2038) et le compteur de visionnements de YouTube, passé en 64 bits quand la chanson Gangnam Style a menacé les 2,1 milliards de vues.
Les réflexes de pro
1. Connaître la taille de ses boîtes dès qu'on quitte les int de Python (NumPy, fichiers binaires, autres langages).
2. Choisir un type assez grand pour la plus grande valeur possible du programme, pas pour la valeur d'aujourd'hui : c'est l'erreur d'Ariane 5.
3. Se méfier des résultats absurdes : un compteur qui devient négatif ou un total qui rajeunit, c'est la signature d'un débordement.
Complément jumeau : les erreurs d'arrondi, quand c'est la précision de la boîte qui trahit plutôt que sa taille.