• Aucun résultat trouvé

Représentation des entiers relatifs en binaire, additions

On se concentre maintenant sur les entiers en base 2. D’après le théorème 2.2, un entier strictement positif N s’écrit donc de manière unique N =Pn−1

k=0bk2k, avec n ≥ 1, bn−1= 1 et ai ∈ {0, 1} pour i < n − 1. Les entiers (bk)

sont appelés les bits de N .

2.2.1

Entiers naturels de taille fixée et additions.

Entier naturel de taille fixée. En pratique en informatique, les entiers sont stockés dans des emplacements mémoire ayant une taille fixée : aujourd’hui les registres d’un microprocesseur ont une taille de 32 ou 64 bits. On suppose donc maintenant que nos entiers ont une taille n fixée (par exemple n = 64), et on note toujours N = Pn−1

k=0bk2k,

mais on ne suppose plus que bn−1soit égal à 1. Ainsi, le plus petit nombre que l’on peut représenter est 00 · · · 0

| {z }

n 2

= 0 et le plus grand est 11 · · · 1

| {z } n 2 =Pn−1 k=02 k = 2n−1 2−1 = 2 n− 1. Le bit b

0 est appelé bit de poids faible et le bit bn−1 est le

bit de poids fort.

Additions. L’addition sur entiers naturels se fait comme sur les entiers en base 10 : il suffit de savoir comment additionner deux chiffres et propager les retenues. C’est particulièrement facile en binaire, puisqu’il n’y a que 2 chiffres ! La table d’addition est la suivante :

+ 0 1 0 0 1 1 1 10

Le 10 signifie que le résultat fait 0 et qu’il faut ajouter un bit de retenue. L’addition se fait de droite à gauche, comme à l’école primaire. Par exemple sur 6 bits (les 1 en exposants sont des retenues) :

1 01 01 1 0 1

+ 0 0 1 1 1 0 1 1 0 0 1 1 En repassant en base 10, on vérifie que 37 + 14 vaut bien 51.

2.2. REPRÉSENTATION DES ENTIERS RELATIFS EN BINAIRE, ADDITIONS. Lycée Masséna

Dépassement de capacité sur entiers naturels. Il n’est pas exclu que la dernière addition génère une retenue (on parle de retenue sortante). Dans ce cas, le résultat de l’addition des deux entiers de n bits ne tient pas sur n bits : on parle alors de dépassement de capacité. Prenons un exemple sur 8 bits :

1 0 01 11 01 1 0 1 + 1 0 0 0 1 1 1 0 1 0 0 1 0 0 0 1 1

Le 1 encadré correspond à la retenue issue de l’addition des deux derniers bits. Il faudrait donc 9 bits pour représenter la somme. En effet, 149+142 vaut 291, qui dépasse 255 = 28− 1, la valeur maximale représentable sur 8

bits. C’est exactement un tel dépassement de capacité (oui, sur 8 bits !) qui a causé le crash d’Ariane 5 en 19964.

En interne. En pratique, un additionneur n bits correspond au chaînage de n additioneurs 1 bit de la forme de la figure 2.1. Bit 1 Bit 2 Résultat Retenue entrante Retenue sortante

+

Figure 2.1 – Additionneur 1 bit

Le chaînage se fait en connectant les retenues entrantes et sortantes des additionneurs successifs (on positionne la retenue entrante initiale à 0). Les valeurs du résultat et de la retenue sortante dans un additionneur 1 bit en fonction des deux bits d’entrée et de la retenue entrante sont données dans la tableau suivant.

Bit 1 0 0 0 0 1 1 1 1 Bit 2 0 0 1 1 0 0 1 1 Retenue entrante 0 1 0 1 0 1 0 1 Résultat 0 1 1 0 1 0 0 1 Retenue sortante 0 0 0 1 0 1 1 1

2.2.2

Entiers relatifs

On va voir une représentation des entiers relatifs qui permet d’additionner en faisant exactement la même chose qu’avec des entiers naturels !

Représentation par valeur absolue. Une première idée pour représenter des entiers relatifs sur n bits est d’utiliser le premier bit comme bit de signe, les autres bits étant dévolus à la représentation de la valeur absolue de l’entier. Avec la convention que le bit de signe 1 est utilisé pour les nombres négatifs et 0 pour les nombres positifs, on obtient par exemple sur 6 bits :

0110102= 26 et 1000012= −1.

4. En fait, l’accélération horizontale était codée comme un entier sur 8 bits, comme sur les versions précédentes des fusées Ariane. Seulement, Ariane 5 étant beaucoup plus puissante, cette accélération pouvait atteindre la valeur 300, qui nécessite 9 bits sur entiers naturels. Le dépassement de capacité a produit une valeur aberrante, qui a mené le logiciel à ordonner la destruction de la fusée. Source : https://fr.wikipedia.org/wiki/Vol_501_d%27Ariane_5.

De cette façon, on représente l’ensemble des entiers de l’intervalle [[−(2n−1− 1), 2n−1− 1]], avec deux zéros. Le zéro

« positif » est 00 · · · 0, et le zéro « négatif » est 100 · · · 0. Le problème de cette représentation est qu’elle ne permet pas d’effectuer facilement les additions.

Représentation en complément à 2. C’est la représentation des nombres relatifs la plus utilisée. Pour an−1· · · a0

une séquence de n bits, on considère que ce nombre représente :

an−1· · · a0=  Pn−2 k=0ak2 k si a n−1= 0 −2n−1+Pn−2 k=0ak2k si an−1= 1 Puisque la séquence Pn−2

k=0ak2k peut décrire tous les entiers naturels entre 0 et 2n−1− 1, la représentation en

complément à 2 permet de représenter tous les nombres de l’intervalle [[−2n−1, 2n−1− 1]], de manière unique. Notez

qu’il est facile de voir si un nombre est positif ou strictement négatif dans cette représentation : il suffit de regarder le bit de poids fort. S’il est nul, le nombre est positif, sinon, il est strictement négatif. En reformulant, on représente N ∈ [[−2n−1, 2n−1− 1]] par :



la représentation de N sur n bits en entier naturel, si N ≥ 0

la représentation de 2n+ N = 2n− |N | sur n bits en entier naturel, si N < 0.

Donnons tout de suite la table des entiers sur 4 bits pour clarifier les choses. Ici n = 4, donc on peut représenter les nombres de −8 à 7.

suite de bits 0000 0001 0010 0011 0100 0101 0110 0111 signification sur entiers naturels 0 1 2 3 4 5 6 7

signification sur entiers relatifs 0 1 2 3 4 5 6 7 suite de bits 1000 1001 1010 1011 1100 1101 1110 1111 signification sur entiers naturels 8 9 10 11 12 13 14 15

signification sur entiers relatifs -8 -7 -6 -5 -4 -3 -2 -1

On observe bien que dans le cas où la suite de bits commence par un 1, on déduit sa signification sur entiers relatifs en complément à 2 de celle sur entiers naturels par l’opération x 7→ −24+ x. Cette représentation devrait s’appeler complément à 2n, mais est rentrée dans le langage courant sans référence au nombre de chiffres de l’entier représenté. Remarque 2.6 (Entier naturel ou relatif ?). Une même suite de bits an−1an−2· · · a0peut donc avoir deux significations

différentes. Savoir si elle représente un entier naturel ou un entier relatif5ne dépend pas de la mémoire (qui se contente

de stocker des bits), ni du processeur (qui se contente d’effectuer des opérations), mais du programme qui manipule cette suite de bits.

Addition d’entiers relatifs. Montrons sur quelques exemples que, s’il n’y a pas dépassement de capacité, le résultat de l’addition faite avec cette représentation comme avec des entiers naturels donne le bon résultat.

Pour chacun des couples (3,4), (-1,6) et (-2,-3), représentable sur 4 bits en tant qu’entiers relatifs, le résultat de l’addition appartient à l’intervalle [[−8, 7]], il n’y a donc pas dépassement de capacité de l’addition sur entiers relatifs avec 4 bits disponibles.

0 0 1 1 + 0 1 0 0 0 0 1 1 1 11 11 1 1 + 0 1 1 0 1 0 1 0 1 11 1 1 0 + 1 1 0 1 1 1 0 1 1

Le chiffre encadré contient l’éventuelle retenue sortante. On voit que le résultat est correct, à condition de ne pas tenir compte de cette retenue sortante. Montrons que le résultat est en effet correct :

Théorème 2.7. Soit n un entier strictement positif, et N et M deux nombres entiers appartenant à l’intervalle [[−2n−1, 2n−1 − 1]]. Si N + M appartient lui aussi à cet intervalle, alors la représentation sur entiers relatifs en

complément à 2 de l’entier N + M se déduit de celles de N et de M par addition sur entiers naturels, en ignorant l’éventuel bit de retenue sortante.

Démonstration. On va distinguer les cas suivants si N et M sont positifs ou strictement négatifs.

2.2. REPRÉSENTATION DES ENTIERS RELATIFS EN BINAIRE, ADDITIONS. Lycée Masséna

— Supposons que N et M sont tous deux positifs ou nuls. Alors leur représentation sur entiers relatifs en complément à 2 sur n bits correspond à celle sur entiers naturels, et le résultat de l’addition est celui de N + M comme entier naturel sur n bits. Comme le résultat est supposé appartenir à [[−2n−1, 2n−1− 1]], le bit de poids fort de la somme

est zéro, et correspond bien à la représentation sur entiers relatifs en complément à 2 sur n bits de N + M . — Supposons N ≥ 0 et M < 0. Remarquez que dans ce cas, la somme N + M appartient forcément à l’intervalle

[[−2n−1, 2n−1−1]] : il ne peut y avoir dépassement de capacité en additionnant deux nombres de signes contraires. L’addition sur entier naturels correspond à l’entier 2n+ N + M . Deux cas sont à distinguer :

— Si N + M ≥ 0, alors 2n correspond à la retenue sortante : si on l’ignore on obtient bien N + M comme entier positif en représentation sur entiers relatifs en complément à 2.

— Si N +M < 0, alors 2n+N +M correspond précisément à la représentation sur entiers relatifs en complément

à 2 de N + M .

Dans les deux cas, le résultat est correct.

— Si N < 0 et M ≥ 0, le résultat est correct : il suffit de reprendre le raisonnement précédent en échangeant N et M .

— Enfin, si N et M sont tous deux strictement négatifs, l’addition correspond à l’addition sur entiers naturels de 2n+ N + 2n+ M ≥ 2n. Il y a donc nécessairement une retenue sortante et l’ignorer revient à considérer l’entier

naturel 2n+ N + M , qui correspond bien à la représentation sur entiers relatifs en complément à 2 de N + M

puisque N + M est strictement négatif

Comme on l’a dit dans la preuve, le dépassement de capacité (c’est-à-dire que N + M n’appartient pas à l’intervalle [[−2n−1, 2n−1− 1]]) ne peut se produire que si N et M sont de même signe. Voici deux exemples de dépassement sur 4 bits donnés par les couples (5,6) et (-8,-1) :

01 1 0 1 + 0 1 1 0 0 1 0 1 1 1 0 0 0 + 1 1 1 1 1 0 1 1 1

Remarque 2.8. On aurait pu affiner le théorème précédent en montrant de plus qu’il y a dépassement de capacité, si et seulement si les deux dernières retenues (la retenue sortante et la retenue sur le bit de poids fort) sont différentes. Vous pouvez vérifier sur les exemples. En pratique, c’est comme cela que fonctionne l’additionneur d’une unité arithmétique et logique d’un processeur : l’additionneur est réalisé en connectant des additionneurs 1 bits, de plus on peut détecter les dépassements de capacité sur entiers naturels (la retenue sortante vaut 1) et sur entiers relatifs (la retenue sortante est différente de la dernière retenue). Le programme qui a lancé l’opération peut récupérer ces informations pour éventuellement prendre en compte le dépassement de capacité, par exemple pour avertir l’utilisateur.

2.2.3

En pratique.

Dans un ordinateur, on utilise maintenant des registres de 32 ou 64 bits, ce qui autorise la représentation d’entiers relatifs dans les intervalles [[−231, 231− 1]] ou [[−263, 263− 1]]. Si le résultat d’un calcul ne rentre pas dans l’intervalle,

le résultat est erroné.

Par exemple, dans un langage de bas niveau comme le C, le typeint correspond à des entiers relatifs codés sur 32 bits. Le calcul et l’affichage des puissances de 3 successives produit le résultat (tronqué) suivant :

3^18=387420489 3^19=1162261467 3^20=-808182895

Que se passe-t-il ? On a l’encadrement suivant : 319< 231− 1 < 320. Le calcul de 320produit donc un dépassement

de capacité, ce qui explique le résultat aberrant6. Fort heureusement, il est possible de calculer avec des entiers plus

longs en C, mais voila la preuve qu’il faut faire attention : on n’a pas eu droit à un message d’erreur !

Et en Python ? En Python, les entiers sont non bornés. Par exemple, Python n’a aucun mal à calculer et afficher7

correctement 44444444. Les longs entiers sont en fait codés par paquets de bits de longeur fixée, et il peut y avoir

un nombre potentiellement infini de paquets (limité par la mémoire, naturellement). Tout ceci se fait de manière transparente pour l’utilisateur, on n’aura donc pas à se soucier des dépassements de capacité lorsqu’on manipulera des entiers.

6. Pas si aberrant que ça : le résultat obtenu pour 320est exactement 320− 232!

Sur vos calculatrices. Dépendant de votre modèle, le nombre de bits maximal est différent, et bien qu’assez élevé, est limité. Vous pouvez faire une boucle, calculant par exemple les puissances de 3 jusqu’à 10000 pour voir si vous obtenez une erreur ou un résultat faux.