On a vu précédemment comment coder un nombre entier positif en binaire. Mais comment coder $-1$, $2$, $\dots$ ?
On se place dans le cadre d'un ordinateur pour lequel l'espace alloué au stockage d'un nombre est fixe.
import sys
# Le plus grand entier que python puisse gérer a priori
sys.maxsize
# Ce nombre est égal à :
2**63-1
Pour simplifier les choses dans un premier temps, imaginons que nos nombre occupents $4$ bits. On peut donc coder $2^4 = 16$ nombres différents.
Une première idée pour coder les nombres positifs et négatifs est d'utiliser le bit de poids fort : si c'est un $0$ on est face à un nombre positif, si c'est un $1$, un négatif :
Commence par $0$ | Commence par $1$ |
---|---|
$0000_2 = +0 $ | $1000_2 = -0$ |
$0001_2 = +1 $ | $1001_2 = -1$ |
$0010_2 = +2 $ | $1010_2 = -2$ |
$0011_2 = +3 $ | $1011_2 = -3$ |
$ \dots $ | $ \dots $ |
Est-ce satisfaisant ?
0 | 0 | 0 | 1 | |
+ | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 |
Celon nos règles de codages, on obtient $1010_2 = -2$ ! Cela ne va pas du tout... Cette façon de coder n'est donc pas satisfaisante.
La méthode correcte de codage des entiers relatifs est la suivante (on se place sur $6$ bits) :
Comme on peut le voir on a donc moins d'entiers positifs que de négatifs. Sur $6$ bits :
Et dans la réalité ? Si l'on utilise $64$ bits :
Remarque : En python, les entiers sont de taille indéfinie, on peut tout à fait dépasser ces valeurs.
Remarque : La fonction bin
de python ne gère pas les nombres négatifs. Elle ajoute un signe $-$ devant l'écriture binaire du nombre positif correspondant.
bin(-19)
La méthode utilisée pour écrire rapidement les nombres négatifs est celle du complément à deux.
Elle nécessite trois étapes. Pour coder un nombre entier négatif :
Essayons avec $-19$. On se place dans le cas où les nombres occupent $6$ bits :
On obtient $-19 = 101101_2$. Pour vérifier on additionne $+19 + (-19)$ :
0 | 1 | 0 | 0 | 1 | 1 | |
+ | 1 | 0 | 1 | 1 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 |
On obtient bien $0$ par le jeu des retenues.
Exercice 1 :
Coder en binaire (sur $6$ bits) les nombres suivants :
Cette façon de faire va grandement simplifier les soustractions.
En effet soustrait un nombre, c'est additionner son opposé. Or l'addition binaire est facile à faire !
Pour faire $8 - 9$ (sur $6$ bits), on commence par coder $8$ et $-9$ en binaire :
On fait ensuite l'addition :
0 | 0 | 1 | 0 | 0 | 0 | |
+ | 1 | 1 | 0 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 |
On obtient le dernier nombre possible : $-1$.