logo
Binaire & Nombres relatifs

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.

1ère solution possible

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 :

Solution choisie : Le complément à Deux

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 :

schéma binaire complément à 2

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

SYNTHESE

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.

Comment savoir si l’entier sera codé sur 16 bits ? 32 bits ?

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é.

Exercices :

  1. Quel est le résultat de la somme d'un nombre binaire (sur 16 bits) et de son complément à un ?
  2. Quels entiers relatifs peut-on coder sur huit bits ?
  3. Trouver "à la main" les représentations sur 8 bits des entiers relatifs 0 et -128, 127, 101 et -94
  4. Déterminer les valeurs des entiers relatifs codés sur 8 bits par : 00010111(2) et 10001100(2)
  5. Calculer la représentation sur 8 bits de l’entier relatif 11, puis celle de son opposé

A consulter :

  1. IUT Info reims
  2. Convertisseur en ligne pour vérifier.
  3. Villemin Gerard
  4. wikipédia complément à deux
  5. Informatique Lycée
  6. tux family

Solutions des exercices de conversion :

Question 1

Quel est le résultat de la somme d'un nombre binaire (sur 16 bits) et de son complément à un ?

>>> Proposition de solution - Proposition de solution - Proposition de solution <<<
Le résultat de la somme est 1111111111111111(2)

Question 2

Quels entiers relatifs peut-on coder sur huit bits ?

>>> Proposition de solution - Proposition de solution - Proposition de solution <<<
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

>>> Proposition de solution - Proposition de solution - Proposition de solution <<<
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)

>>> Proposition de solution - Proposition de solution - Proposition de solution <<<
00010111 --> 23
10001100 --> -116

Question 5

Calculer la représentation sur 8 bits de l’entier relatif 11, puis celle de son opposé

>>> Proposition de solution - Proposition de solution - Proposition de solution <<<
00001011 --> 11
11110101 --> -11