Livre_silo 30 août 2013 16:32 Page 42
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
42
Informatique pour tous
Le
dernier
résultat,
4569760000,
est
représenté
en
binaire
par
1 00010000 01100001 00000001 00000000. Si l’on reste dans une représentation sur 32 bits, le bit le plus à gauche est perdu : on ne mémorise que
00010000 01100001 00000001 00000000 = 274792704, qui n’est évidemment pas le résultat attendu. On appelle ce phénomène dépassement arithmétique (overflow en anglais).
Il faut donc changer de représentation pour éviter de perdre la valeur du résultat. En Python, ce changement de représentation est fait automatiquement, mais c’est loin d’être le
cas dans tous les langages de programmation. La plupart du temps, si le résultat d’un calcul
dépasse les limites de la représentation des entiers, les bits surnuméraires sont purement
et simplement perdus.
Dans ces langages, une conséquence inattendue de la notation en complément à 2
dans les dépassements est la suivante : le nombre 2 000 000 000 s’écrit en binaire
01110111 00110101 10010100 00000000 et donc l’opération 2 000 000 000 + 2 000 000 000
a pour résultat 11101110 01101011 00101000 00000000. Ce dernier nombre ne dépasse pas
les 32 bits, mais dans la notation en complément à deux, il représente −294 967 296 et
non pas 4 milliards. La somme de deux entiers positifs trop grands peut donc donner un
résultat négatif ! De même, la somme de deux entiers négatifs peut résulter en un entier
positif.
En Python, la seule limite pour la représentation des entiers, qu’ils soient naturels ou relatifs, est la mémoire disponible sur la machine. Les exemples précédents de dépassements
arithmétiques ne se produisent donc pas.
EN PRATIQUE Dans les versions Python 2.x
Lorsque la capacité des entiers machine (32 ou 64 bits) a été dépassée, les nombres sont
suivis du marqueur L, qui explicite qu’on passe dans un autre type appelé long. La dernière
ligne de l’exemple précédent affiche donc plutôt
In [4]: a*a*a*a
Out[4]: 4569760000L
En Python 3.x, les types int et long sont fusionnés et, à toutes fins utiles, les entiers sont
toujours de taille illimitée. Le marqueur L n’est plus utilisé.
Pour représenter des entiers de taille arbitraire, il a fallu prendre une certaine distance avec
la représentation machine des entiers. Ainsi, dans l’implantation de référence de Python,
sur les machines 32 bits, lorsque l’on veut représenter un entier x, on découpe la représentation binaire de x par paquets de 15 bits et on stocke les entiers correspondants dans un
tableau d’entiers naturels sur 16 bits. Ce tableau contient donc les chiffres de x en base
2
15 . De plus, à ce tableau on associe un entier taille qui donne le nombre de chiffres de x
en base 2
15 et dont le signe est le signe de x.
Précédent

- 55/402

Suivant