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 pous 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 $1|0000110$

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

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}=0|00_{2}$ et $0_{10}=1|00_{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. Et 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 l'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 :

  1. $12_{10}=1100_2$. Nous sommes sur 8 bits donc il faut écrire $12_{10}=00001100_2$.
  2. On remplace tous les 0 par des 1 et les 1 par des 0 : $00001100_2$ devient $11110011_2$
  3. On ajoute 1 :$\begin{array}{rrrrrrrrr} &&&&&&1&1&\\ &1&1&1&1&0&0&1&1&\\ +&0&0&0&0&0&0&0&1\\ \hline\\ &1&1&1&1&0&1&0&0 \end{array}$
  • Vérifions le résultat en ajoutant -12 et 12 dans leur représentation binaire: $\begin{array}{rrrrrrrrr} 1&1&1&1&1&1&&&\\ &1&1&1&1&0&1&0&0\\ +&0&0&0&0&1&1&0&0\\ \hline\\ 1&0&0&0&0&0&0&0&0 \end{array}$

    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$ effectuez ensuite l'addition avec la représentation de 19 en binaire..
    2. Déterminer la représentation en binaire sur 16 bits de $-72$ effectuez ensuite l'addition avec la représentation de 72 en binaire.

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

    $12_{10}=1100_{2}$ mais en représentation en complément à 2 sur 4 bits $1100_{2}=-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 :

    Testez :

    Vous devriez avoir :

    L'objectif de cet exercice est d'écrire une fonction en Python dec_relatif_en_binaire(entier,nb_bit) qui converti un entier relatif en binaire sur nb_bit.

    Il faudra penser à gérer le manque de bits et renvoyer un message d'erreur explicite.

    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.

      Testez :

      Vous devriez avoir :

    2. Ecrire une fonction ajoute_1(lst) qui ajoute 1 à un binaire représenté dans une liste

      Vous devriez avoir :

    3. Ecrire la fonction dec_relatif_en_binaire(entier,nb_bit)
      Vous utiliserez abs() pour la valeur absolue d'un nombre.

      Testez :

      Vous devriez avoir :

    Ecrire une fonction binaire_en_dec(l) qui a pour argument une liste `l` correspond à un entier écrit en binaire et qui renvoie l'entier en décimal

    Testez :

    Vous devriez avoir :

    Ecrire une fonction add(nb1,nb2,nb_bit) qui renvoie le résultat de la somme de nb1 et de nb2 en binaire sur nb_bit.

    Testez :

    Vous devriez avoir :

    correction des exercices Licence Creative Commons
    NSI de Auteurs : Jean-Christophe Gérard, Thomas Lourdet, Johan Monteillet, Pascal Thérèse est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.