Nous avons vu que sur un octet on peut représenter les nombres entiers naturels allant de 0 à 1111 1111(2) soit de 0 à 255 (28 – 1 = 255)
Ainsi le nombre entier naturel 13 est représenté en base 2 par : 1101(2) il est donc représenté dans la mémoire d’un ordinateur par le mot 1101.
Nous allons étendre aux entiers relatifs la représentation binaire des entiers naturels.
Réserver un bit pour le signe et utiliser les autres pour représenter sa valeur absolue.
Ainsi, avec des mots de 16 bits, si on utilise 1 bit pour le signe et 15 bits pour la valeur absolue
on obtient alors la réprésentation suivante :
Quelques Inconvénient de cette représentation :
Pour éviter les inconvénients de la représentation précédente on va utiliser la représentation en complément à 2.
Pour comprendre cette notion de complément à deux il nous faut commencer par définir ce que l'on appelle le complément à Un.
Le complément à Un d'un nombre binaire est la valeur obtenue en inversant tous les bits de ce nombre (en permutant les 0 par des 1 et inversement).
Exemple : Le nombre 00000001(2) soit +1(10) aura pour complément à un le nombre 11111110(2) qui doit correspondre à -1(10)
Testons notre addition !
00000001(2) + 11111110(2) = 11111111(2)
Cela ne nous donne toujours pas le résultat attendu qui devrait être zéro.
Pour y arriver, l'astuce va consister à rajouter 1(2) à notre complément à un. On parle alors de complément à Deux.
Du coup le complément à 2 de notre valeur 00000001(2) correspond au nombre : 11111110(2) + 1(2) soit 11111111(2)
Testons à nouveau notre addition !
00000001(2) + 11111111(2) = 00000000(2) (Avec une retenue de 1 qui va être ignorée !)
Cela nous donne bien le résultat attendu de zéro.
Cette retenue qui va au-delà du 8ème bit correspond à ce que l'on appelle un dépassement de capacité.
C'est le fait que le calcul est limité à 8 bits qui fait que notre système de complément à deux fonctionne !
Pour terminer, vous pourrez remarquer que passer au complément à deux revient à translater les nombres négatifs comme vous pouvez le voir sur la figure ci-dessous :
Remarque
Le complément à 2 consiste à ajouter la valeur 1 au complément à 1 du nombre.
Ces noms de complément à 1 et de complément à 2 n'ont donc rien à voir avec les nombres 1 et 2. Il s'agit juste du nombre de manipulations effectuées.
Une première manipulation pour passer au complément à 1 suivi d'une deuxième manipulation pour passer au complément àdeux
Plus généralement, avec des mots de n bits, on peut représenter les entiers relatifs compris entre – 2n-1 et 2n-1 – 1.
On représente l’entier relatif 𝑥 positif ou nul comme l’entier naturel 𝑥.
On représente l’entier relatif 𝑥 strictement négatif comme l’entier naturel 𝑥 + 2n.
Ainsi, un entier positif est représenté par un mot dont le premier bit sera 0, et un entier négatif par un mot dont le premier bit sera 1.
Expliquons le dernier cas dans le cas des nombres codés sur 16 bits :
32 768 = 215 donc tout nombre entier compris entre 32 768 et 65 535 a forcément son bit le plus fort égal à 1.
Exemple : 32 770 = 32 768 + 2 = 215 + 21= 1000 0000 0000 00102.
Au contraire, un entier positif codable sur 16 bits, varie entre 0 et 32 767 : 32 767 < 215
Donc si on prend par exemple, 16 384 = 214= 0100 0000 0000 00002.
Rien dans la représentation binaire n’indique comment il faut interpréter un mot mémoire donné. Le même mot peut être lu de différentes façons.
Il faut donc garder à part une trace des conventions de codage qu’on a décidé d’utiliser.
Avec Python, le type int désigne en principe des entiers relatifs représentés sur 32 bits, c’est à dire 4 octets :
les valeurs possibles sont donc de – 2 147 483 648 à 2 147 483 647. Mais, si on travaille sur une machine 64 bits, la représentation des entiers sera également faite sur 64 bits :
on dispose donc des entiers de -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807 !!!
L’ensemble des valeurs de type int dépend donc de la machine sur laquelle un programme Python est exécuté.
Question 1
Quel est le résultat de la somme d'un nombre binaire (sur 16 bits) et de son complément à un ?
Le résultat de la somme est 1111111111111111(2)
Question 2
Quels entiers relatifs peut-on coder sur huit bits ?
Les valeurs vont de -128 à +127
Question 3
Trouver "à la main" les représentations sur 8 bits des entiers relatifs 0 et -128, 127, 101 et -94
00000000 --> 0 10000000 --> -128 01111111 --> 127 01100101 --> 101 10100010 --> -94
Question 4
Déterminer les valeurs des entiers relatifs codés sur 8 bits par : 00010111(2) et 10001100(2)
00010111 --> 23 10001100 --> -116
Question 5
Calculer la représentation sur 8 bits de l’entier relatif 11, puis celle de son opposé
00001011 --> 11 11110101 --> -11