Représentation d'un nombre relatif en binaire

Représentation des données: types et valeurs de base

Plan

Méthode naive

Au chapitre précédent nous avons appris à représenter des nombres entiers naturels (type int). Nous allons maintenant apprendre à représenter les nombres négatifs (type int aussi). L'ensemble des nombres binaires entiers relatifs se nomme les nombres binaires signés.

La méthode la plus élémentaire, jamais utilisée en pratique, consiste à utiliser l'un des bits (le premier, donc le bit fort) pour représenter le signe. Si l'on prend l'exemple d'un octet (8 bits), on a alors un bit de signe et sept bits pour coder la valeur absolue (un nombre indépendamment de son signe).

Exemple : Sur 8 bits on peut représenter des nombres signés de -127 à +127.

Lorsque le bit le plus à gauche est un 0, le nombre est positif. 0 1 1 1 1 1 1 1 , ici le résultat est +127 comme en binaire pur.

Lorsque le bit le plus à gauche est un 1, le nombre est négatif . 1 1 1 1 1 1 1 1 , ici le résultat est -127.

L’inconvénient c’est que le zéro a deux représentations 00000000 et 10000000.

Plus ennuyeux encore, l'addition classique ne fonctionne plus. Nous ne l'avons pas dit au chapitre précédent mais les méthodes de calcul vues en primaire (addition, soustraction, multiplication) sont toujours valides sur les nombres binaires.

Posons (-3 + 3)10=

3 s'écrit 11 en binaire (1 x 21+1 x 20). En binaire signé sur 8 bits l'addition -3+3 donne 10000011 et 00000011

Une fois posée:

1 0 0 0 0 0 1 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 1 0

donc (10000011+00000011)2=(10000110)2=(- 6)10 .
On aurait préféré 0 (00000000)2 !

Notre écriture du -3 ne convient donc pas.
Par quoi faut-il remplacer  10000011 pour que ? +  00000011 = 0
Réponse : 111111101.

Si on garde le bit fort pour représenter le signe, il reste donc x11111101 qui serait donc égal à 3 !

Pour rappel 3 s'écrit 0000011. Comment retrouver alors ce -3 ?
On retranche 1 à  111111101, cela fait  111111100....le 3 (00000011) n'est plus loin, il suffit d'inverser les bits (remplacer 0 par 1 et inversement).
Bien évidement on ne fait cela que lorsque le  bit fort est 1. Il reste alors 27 bits et nos nombres iront donc de -128 à + 127.

Méthode du complément à 2

Les remarques précédentes nous ménent à la construction des nombres binaires signés par la méthode du complément à 2.

Voici la règle:

  • Les nombres positifs sont représentés comme vu au premier chapitre mais le bit le plus fort vaut forcément zéro.
  • Les nombres négatifs sont obtenus en deux étapes:
    • On inverse les bits de l'écriture binaire de sa valeur absolue (opération binaire NON, voir cours sur les opérateur logiques dits booléens). Cela s'appelle le complément à un,
    • On ajoute 1 au résultat (les dépassements sont ignorés).

Cette opération correspond au calcul de 2n−|x|, où n est la longueur de la représentation (par exemple 8 si l'on code sur 8 bits) et |x| la valeur absolue du nombre à coder. Vérifions avec le -3 précédent: 28-3=253 qui s'écrit en binaire 1111 1101.

Ecrivons −1: 256-1=255=1111 11112, pour un codage sur 1 octet (8 bits).

L'opération 2n−|x| est à l'origine du nom de cette opération : "complément à 2 puissance n", réduit en général à "complément à 2".

Il est rassurant de constater que la même opération effectuée sur un nombre négatif donne le nombre positif de départ: 2n − (2n−x) = x. L'opposé de l'opposé est le nombre de départ! Cela veut donc dire que l'on peut utiliser la même méthode pour passer de binaire à décimal!

De décimal à binaire

Entrainons nous sur un exemple:

Pour coder (−17) sur 8 bits méthode 1:

  • On prend le nombre positif 17 : 16+1 donc 24 et 20 donc 00010001
  • On inverse les bits : 11101110 (complément à 1)
  • On ajoute 1 : 11101111 (complément à 2)

Le bit de signe est automatiquement mis à 1 par l'opération d'inversion.

Pour coder (−17) sur 8 bits méthode 2:

  • 28-17=239 soit en binaire 11101111

Le bit de signe est automatiquement mis à 1 par les calculs.

On peut vérifier que cette fois l'opération 16 + (−17) par exemple se fait sans erreur : 00010000 + 11101111 = 11111111
Vérifions que 11111111 vaut -1.

11111111-1=11111110 puis le complément : 00000001

On a bien trouvé 1 et en tenant compte du poid fort qui est à 1 cela fait bien (−1) en décimal.

De binaire à décimal

Ce sont les même méthodes. Si le bit fort (le plus à gauche) est un 1, notre nombre est négatif et il faut faire le complément à 2, sinon il est positif et on convertit comme pour tout entier naturel.

Essayons avec 1111 1101 (on connait la réponse...c'est -3)

Méthode 1: 1111 1101 devient 0000 0010 puis on ajoute 1 donc 0000 0011..ça marche!

Méthode 2: 1111 1101 = 253 et 28-253=3, puisqu'il y a un 1 en bit fort, cela fait -3


Plus généralement, avec des nombres sur n bits, on écrit les entiers relatifs compris entre -2n-1 et 2n-1-1:
un entier relatif x positif ou nul compris entre 0 et 2n-1-1 est représenté par l’entier naturel x compris entre 0 et
 2n-1-1 ;
un entier relatif x strictement négatif compris entre -2n-1 et – 1 est représenté par l’entier naturel x +2n

 

Exercices

  1. Donner les compléments à 2 des nombres décimaux suivants sur 8 bits: 25, -30, -124,100

  2. Soit le nombre binaire en complément à 2: 00110111. Donner le signe de ce nombre. Ecrire en binaire l'opposé de ce nombre.

  3. Peut-on écrire un nombre binaire en complément à 2 sur 16 bits? Si oui, donner un exemple de nombre négatif.

  4. Soit les nombres binaires écrits en complément à 2 sur 8 bits: a=10101010 et b=01101101. Calculer a+b en binaire. Ecrire a et b en décimal et vérifier le résultat de votre addition.

  5. Soit les nombres binaires écrits en complément à 2 sur 8 bits: c=10001011 et d=00010101. Calculer c+d en binaire. Ecrire c et d en décimal et vérifier le résultat de votre addition.

  6. Soit e=10011100 et f=00010101 en binaire signés sur 8 bits. Calculer e-f en binaire et en décimal. Que constatez vous?

  7. Calculer c-d (cf exercice 5) en binaire et en décimal. Que constatez-vous? Pourquoi?

Android

De la programmation pour pc à la programmation pour téléphone.

A finir

Pas eu le temps de tout faire.....