représentation d'un entier relatif

Il ya longtemps, très longtemps... Nous avons découvert comment nous pouvions convertir du binaire vers un entier relatif et réciproquement. Ici, nous allons découvrir qu'on peut convertir du binaire en entier relatif.

Une première représentation intuitive

Une première idée serait de coder le signe + par un 0 et le signe - par un 1. Ainsi 6(10) = 110(2) se coderait alors en 0110(2) mais -6(10) se coderait alors en 1110(2)

Représenter 14(10) en binaire. Que remarquez vous?

Par conséquent nous allons devoir nous fixer un nombre de bits n,un espace mémoire. On conserve alors le premier pour le signe et les n-1 autres pour le codage de la valeur absolue du nombre.

Ainsi sur 8 bits -6(10) se code en 10000110

Déterminer le codage en binaire sur 8 bits puis sur 9 bits, des nombre suivants :

  • 11
  • -35
  • 26

Un premier problème avec cette représentation est que le chiffre 0(10) a deux représentations. En effet sur 3 bits: 0(10) =000(2) et 0(10)=100(2)

Un autre problème se pose avec cette méthode sur l'addition de deux nombres en binaires.

Reprenez la représentation en binaire de -35 sur 8 bits et ajouter la à la représentation de 35 sur 8 bits.

Oubliez donc cette option !

Le complément à deux.

Cas des entiers naturels

La représentation d'un nombre entier naturel en binaire se fait de la même manière que dans le paragraphe précédent.

Si on dispose de n bits, le premier sera 0 pour indiquer que l'entier est positif. Les n-1 autres seront le codage en binaire de l'entier.

Cela signifie aussi que si l'on dispose de n bits, nous ne pourrons pas dépasser un entier plus grand que 2^(n-1)-1. Puisque nous ne disposons que de n-1 bits.

Si l'on dispose de 5 bits. On a 12(10) = 01100(2)

Si on dispose que de 4 bits. On ne peut tout simplement coder 12 en binaire si nous considérons les entiers relatifs.

Rappelez vous que sur n bits un entier naturel ne pouvait pas dépasser 2^n−1. Quand nous codons des entiers relatifs, nous ne pourrons pas dépasser 2^(n−1)−1 sur n bits.

Cas des entiers négatifs.

Pour représenter un entier négatif nous allons utiliser le "complément à deux":

Voila la procédure :

  1. on code la valeur absolue du nombre en binaire
  2. On remplace tous les 0 par des 1 et les 1 par des 0.
  3. On ajoute 1

Traitons le cas de −12 sur 8 bits :

12(10)=1100(2). Nous sommes sur 8 bits donc il faut écrire 12(10)=00001100(2).
    On remplace tous les 0 par des 1 et les 1 par des 0 : 00001100(2) devient 11110011(2)
    On ajoute 1 :11110011 + 00000001 = 11110100
    
    Vérifions le résultat en ajoutant -12 et 12 dans leur représentation binaire:
     11110100+00001100 = 100000000
    
    Nous sommes sur 8 bits le 1 à la première position doit être enlevé. Nous retombons bien sur 0.
>
  1. Déterminer la représentation en binaire sur 8 bits de -19 puis effectuez ensuite l'addition avec la représentation de 19 en binaire..

Il faut bien distinguer le nombre binaire de sa représentation en binaire.

1210=11002 mais en représentation en complément à 2 sur 4 bits 11002=4

Avec n bits nous pouvons coder uniquement des entiers compris entre -(2^(n-1)-1) et 2^(n-1)-1

C'est le cas puisque le premier bit est réservé au signe de l'entier.

  1. Sur 8 bits, donner un encadrement des entiers relatifs codables
  2. Même question sur 9 bits

Du Python pour finir

Ecrire une fonction en Python dec_en_binaire(entier,nb_bit) qui converti un entier naturel en binaire. La fonction renverra le binaire sous forme de liste sur nb_bit.

Des méthodes utiles :

  • a%b renvoie le reste de la division de a par b
  • a//b renvoie le quotient de la division de a par b
  • l.append(a) ajoute à la liste l l'élément a
  • l.reverse() inverse les éléments d'une liste

Pour les plus avancés:

Ecrire une fonction en Python dec_relatif_en_binaire(entier,nb_bit) qui converti un entier relatif en binaire sur nb_bit.

  1. Ecrire une fonction change_0_en_1(l) qui remplace les 1 en 0 et les 0 en 1 dans une liste. ne contenant que des 0 et des 1.
  2. Ecrire une fonction ajoute_1(lst) qui ajoute 1 à un binaire représenté dans une liste
  3. Ecrire la fonction dec_relatif_en_binaire(entier,nb_bit)
    Vous utiliserez abs() pour la valeur absolue d'un nombre.