Codage des entiers relatifs
Principe
Les entiers relatifs sont les nombres qui peuvent représenter des valeurs entières positives, négatives ou nulles.
Les mathématiciens représentent l’ensemble des entiers relatifs avec le symbole ℤ.
Ces nombres accompagné d’un signe ( ‘+’ ou ‘-’) sont aussi souvent appelés nombres signés.
Le principe de base pour représenter ces nombres est de coder son signe en plus de sa valeur dans la représentation binaire.
1ère tentative (erronée) de représentation
Une 1ère idée serait de prendre 1 bit, par exemple le MSB — c.-à-d. le bit le plus à gauche — pour coder le signe (0 pour le ‘+’ et 1 pour le ‘-’) puis de coder la valeur absolue du nombre dans le reste des bits.
[1][000 0101]
signe ‘-’ ↲ ↳ 5|10 codé sur 7 bits
Cependant, cette représentation présente plusieurs inconvénients :
-
elle autorise une double représentation du 0 (→ 0000 0000|2 et 1000 0000|2 sur 8 bits)
-
cette double représentation du 0 fait perdre une possibilité de coder un autre nombre. Par exemple, sur 8 bits on peut coder avec cette méthode uniquement 255 valeurs de -127 à +127 alors qu’avec 8 bits on peut théoriquement représenter 28 = 256 valeurs
-
et SURTOUT, elle mène à des résultats faux pour l’addition arithmétique quand un des 2 nombres est négatif.
Ex. : 73|10 + -5|100100 10101 → 73|10 (1) + 1000 01 01 → -5|10 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 1100 11 10 → -77|10 ⇒ FAUX (68|10 attendu)
1 noter la présence d’une retenue. En effet, en binaire, 0+0=0, 0+1=1, 1+1=0 et 1+1=10|2
Complément à 2
Pour remédier aux inconvénients de la méthode de représentation précédente, la majorité des langages de programmation vont utiliser une réprésentation dîte en complément à 2 notée 𝒞2(n) en math.
Dans cette représentation :
-
les nombres positifs sont représentés de manière usuelle
-
les nombre négatifs sont codés de la manière suivante :
-
on code en 1er la valeur absolue du nombre de manière usuelle
-
on remplace tous les 0 par des 1 et tous les 1 par des 0. C’est ce qu’on appelle le complément à 1 (noté 𝒞1(n) en math)
-
on ajoute 1 à la valeur obtenue
-
Ex. pour coder sur 8 bits le nombre -5|10 avec la représentation en complément à 2
-
codage de la valeur absolue de -5
|-5| → 0000 0101
-
complément à 1 du résultat précédent
𝒞1(0000 0101) = 1111 1010
-
ajout de 1 au résultat précédent
1111 1010 + 0000 0001 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 1111 1011
Donc, au final, -5|10 se code 1111 1011|2 en complément à 2.
On peut alors vérifier qu’avec cette représentation :
-
le 0 n’a qu’une seule représentation sur un nombre de bits donné :
-
+0 sur 8 bits donne : 0000 0000
-
-0 donne : 1 0000 0000 (→ 9 bits). Mais comme on désire un codage sur 8 bits, le 9ème bit est simplement ignoré et on retombe bien sur 0000 0000.
-
-
on va pouvoir représenter autant de valeurs que le nombre de bits choisi pour les représenter le permet. Ainsi, sur 8 bits on va pouvoir coder 28 = 256 valeurs, de -128|10 (→ 1000 0000|2) à +127|10 (→ 0111 1111|2)
-
l’addition d’un nombre positif et négatif donne le bon résultat
Ex. : 73|10 + -5|10 = 68|101 10111010 110101 + 1 1 1 1 1 0 11 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 1 0 1 0 0 0 1 00 (1)
1 Sur 8 bits (← 9ème bit ignoré), 0100 0100|2 = 68|10 ce qui est bien le résultat attendu
🞄 🞄 🞄