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ésentez $14_{10}$ en binaire. Que remarquez vous?

Code de déblocage de la correction :

Par conséquent nous allons devoir pour 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 :

Code de déblocage de la correction :

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 ajoutez la à la représentation de 35 sur 8 bits.

Code de déblocage de la correction :

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.

Représentation des binaires sur n bits

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.

Si l'on dispose de $n$ bits, nous ne pourrons pas dépasser un entier plus grand que $2^{n-1}-1$.

Nous avons vu dans le chapitre b1 que sur $n$ bits, nous pouvions coder au maximum le nombre $2^n-1$. Puisque nous ne disposons que de $n-1$ bits, le nombre le plus grand codable sera $2^{n-1}-1$.

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 pas coder 12 en binaire si nous considérons les entiers relatifs.

Quel est le plus grand entier naturel codable en considérant un bit pour le signe :

  1. sur 5 bits ?

  2. sur 8 bits ?

Code de déblocage de la correction :

Cas des entiers négatifs

Complément à deux et entiers relatifs

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

Voilà 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 donc le 1 bit de poids fort en 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.

Code de déblocage de la correction :

Le terme complément à deux vient du fait que, sur $n$ bits, le nombre négatif $-x$ est représenté en binaire comme le serait le nombre positif $2^n-x$.

Voici la correspondance entre les nombres binaires de 8 bits codés en complément à deux et les entiers relatifs correspondants :

Écriture binaire Écriture décimale
00000000 0
00000001 1
00000010 2
... ...
01111110 126
01111111 127
10000000 -128
10000001 -127
10000010 -126
... ...
11111110 -2
11111111 -1

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 $2^n$ entiers, ceux compris entre $-2^{n-1}$ et $2^{n-1}-1$

Nous avons vu dans le chapitre b1 que sur $n$ bits, nous pouvions coder $2^n$ entiers.
Puisque le premier bit est réservé au signe de l'entier, nous ne disposons que de $n-1$ bits pour la suite.
Avec 0 comme premier bit, on pourra coder sur les $n-1$ bits restants les $2^{n-1}$ premiers positifs (ou nuls) : ceux entre 0 et $2^{n-1}-1$.
Avec 1 comme premier bit, on pourra coder sur les $n-1$ bits restants les $2^{n-1}$ premiers strictement négatifs : ceux entre -1 et $-2^{n-1}$

  1. Sur 8 bits, donner un encadrement des entiers relatifs codables.

  2. Même question sur 9 bits.

Code de déblocage de la correction :

  1. Déterminer l'écriture décimale du nombre entier relatif dont la représentation binaire en complément à deux est donnée par $11010011_2$.

    Code de déblocage de la correction :

  2. Déterminer l'écriture décimale du nombre entier relatif dont la représentation binaire en complément à deux est donnée par $01110111_2$.

    Code de déblocage de la correction :

  3. Déterminer l'écriture décimale du nombre entier relatif dont la représentation binaire en complément à deux est donnée par $10011001_2$.

    Code de déblocage de la correction :

De nombreuses machines suivent la norme IEEE 1003, appelée aussi norme POSIX. Cette norme spécifie entre autres que le temps est représenté comme le nombre de secondes écoulées depuis depuis le 1er janvier 1970 à 00:00:00 en temps universel.
La plupart des systèmes d'exploitation fonctionnant en 32 bits représente ce nombre de secondes comme un entier signé (nombre binaire utilisant le complément à 2) de 32 bits.

  1. Déterminer le plus grand entier naturel qui peut être représenté sur 32 bits dans le cas du complément à 2 ?

  2. Pourquoi parle-ton "du bug de l'an 2038" ?

  3. Désormais, la plupart des système d'exploitation fonctionnent en 64 bits. Est-ce que cela conduira à un bug en 2106 puisque l'écart entre 1970 et 2038 étant de 68 ans et $2106=2038+68$ ?

Code de déblocage de la correction :

Du Python pour finir

  1. Écrire une fonction en Python dec_en_binaire(entier,nb_bit) qui convertit un entier naturel en binaire. La fonction renverra l'écriture binaire sous forme d'une liste ànb_bit éléments.

    Des opérateurs 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 élements d'une liste l.

    Pensez à tester en précondition si le nombre saisi comme premier paramètre et bien un nombre entier naturel et si le nombre de bits nb_bits est suffisant ou non ; en cas d'erreur, pensez à afficher un message d'erreur approprié.
    Documentez aussi votre fonction !

  2. Testez :

    Vous devriez avoir (au message d'erreur près) :

    Testez aussi :

    Vous devriez avoir (au message d'erreur près) :

Code de déblocage de la correction :

L'objectif de cet exercice est d'écrire une fonction en Python dec_relatif_en_binaire(entier,nb_bit) qui convertit 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. Écrire 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 :

    Code de déblocage de la correction :

  2. Écrire une fonction ajoute_1(lst) qui ajoute 1 à un binaire représenté par une liste de 0 et de 1 (sans prendre en compte un éventuel dépassement).

    Testez :

    Vous devriez avoir :

    Code de déblocage de la correction :

  3. Écrire la fonction dec_relatif_en_binaire(entier,nb_bit).

    Vous utiliserez abs() pour la valeur absolue d'un nombre.

    Vous utiliserez les fonctions déjà écrites en langage Python :

    • dec_en_binaire

    • change_0_en_1

    • ajoute_1

    Testez :

    Vous devriez avoir :

  4. Code de déblocage de la correction :

Écrire une fonction binaire_en_dec(l) qui a pour argument une liste l correspondant à un entier écrit en binaire et qui renvoie l'entier en écriture décimale.

Testez :

Vous devriez avoir :

Code de déblocage de la correction :

  1. Écrire une fonction sommer(nb1,nb2,nb_bit) qui prend en paramètres deux entiers nb1 et nb2, qui additionne ces deux nombres à partir de leur écriture décimale, puis qui transforme cette somme en liste de 0 et de 1 correspondant à l'écriture binaire de ce nombre sur nb_bits, enfin qui renvoie ce résultat.

    Testez :

    Vous devriez avoir :

  2. Code de déblocage de la correction :

  3. Écrire une fonction add(nb1,nb2,nb_bit) qui prend en paramètres deux entiers nb1 et nb2, qui transforme ces deux entiers en liste de 0 et de 1 correspondant à l'écriture binaire de ces nombres sur nb_bits, puis qui additionne ces deux nombres à partir de leur écriture binaire, enfin qui renvoie le résultat de la somme en binaire sur nb_bit bits sous forme de liste de 0 et de 1.

    Vous pouvez utilisez la fonction dec_relatif_en_binaire.

    Testez :

    Vous devriez avoir :

  4. Code de déblocage de la correction :

  5. Comparer l'exécution de chaque fonction lorsque les arguments donnés sont (23,-35,5).

  6. Code de déblocage de la correction :

QCM

Questions issues de la Banque Nationale de Sujets

Propriétaire des ressources ci-dessous : ministère de l'Éducation nationale et de la jeunesse, licence CC BY SA NC

Voici une sélection de questions issues de la banque nationale de sujets, répondez à ces questions (attention, cette sélection n'est pas exhaustive).

Quelle est la représentation en binaire signé en complément à 2 de l’entier −1 sur un octet ?

Réponses :

A- 1000 0000

B- 1000 0001

C- 1111 1110

D- 1111 1111

Code de déblocage de la correction :

Quelle est la plage des valeurs entières (positifs ou négatifs) que l'on peut coder sur un octet (8 bits) en complément à 2 ?

Réponses :

A- -127 à 128

B- -128 à 127

C- -255 à 128

D- -256 à 127

Code de déblocage de la correction :

Quelle est la séquence de bit qui représente –25 en complément à 2 sur 8 bits ?

Réponses :

A- 0001 1001

B- 0001 1010

C- 1110 0110

D- 1110 0111

Code de déblocage de la correction :

Comment s'écrit le nombre −42 en binaire, sur 8 bits, en complément à 2 ?

Réponses :

A- -0010 1010

B- 1010 1011

C- 1101 0101

D- 1101 0110

Code de déblocage de la correction :

À quoi sert le codage en complément à 2 ?

Réponses :

A- à inverser un nombre binaire

B- à coder des nombres entiers négatifs en binaire

C- à convertir un nombre en hexadécimal

D- à multiplier par 2 un nombre en binaire

Code de déblocage de la correction :

L'écriture décimale du nombre 1001 1101 écrit sur 8 bits en complément à 2 est :

Réponses :

A- -4

B- -29

C- -99

D- 157

Code de déblocage de la correction :

Quelle est la représentation binaire en complément à deux sur huit bits du nombre –3 ?

Réponses :

A- 1000 0011

B- 1111 1100

C- 1111 1101

D- 1 0000 0011

Code de déblocage de la correction :

Quel est l'entier codé sur 4 bits en complément à 2 par 1101 ?

Réponses :

A- -6

B- -3

C- 13

D- 14

Code de déblocage de la correction :

Soit $𝑛$ l'entier dont la représentation binaire en complément à deux codée sur 8 bits est 0110 1110. Quelle est la représentation binaire de $−𝑛$ ?

Réponses :

A- 0001 0001

B- 0001 0010

C- 1001 0001

D- 1001 0010

Code de déblocage de la correction :

Autres QCM

Les QCM suivants sont des QCM modifiés à partir de QCM se trouvant sur le site https://genumsi.inria.fr.

En considérant le complément à 2 sur 4 bits, quel est le résultat du calcul : 2-7 ?

Réponses :

A- 0101

B- 1001

C- 1011

D- le résultat ne peut pas être écrit en complément à 2 sur seulement 4 bits.

Code de déblocage de la correction :

En complément à 2 sur 8 bits, quel est l'entier relatif codé par 11010010 ?

Réponses :

A- 210

B- -210

C- 46

D- -46

Code de déblocage de la correction :

Que représente 11010 en complément à 2 sur 5 bits ?

Réponses :

A- -6

B- -5

C- 26

D- -26

Code de déblocage de la correction :

Générateur aléatoire de questions sur les réseaux

Il faut actualiser la page pour changer de question. Propriétaire de la ressource : le site GeNumsi en licence CC BY_NC-SA

Savoirs et savoir-faire

  1. Savoir que l'on utilise le complément à 2 pour une représentation des entiers relatifs en binaire.

  1. savoir représenter un nombre entier relatif sous forme binaire en complément à 2,

  2. savoir trouver l'entier relatif écrit sous forme binaire en complément à 2,

  3. Savoir programmer un script permettant de passer de l'écriture décimale à celle binaire pour un entier relatif.

  4. Savoir programmer un script permettant de passer de l'écriture binaire à celle décimale pour un entier relatif.

Licence Creative Commons
Les différents auteurs mettent l'ensemble du site à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International