Représentation des nombres entiers

Les circuits et mémoires physiques sont des assemblages de transistors ne pouvant prendre que deux états. L'information y est donc stockée sous forme de chaîne de bit (binary digits, chiffres binaires, 0 ou 1). Ce qui impose par exemple une représentation des entiers (relatifs) en écriture binaire.

Rappelons le principe du système de numération positionnel en base 10 :

Par exemple : $$12345_{|10}=5*1+4*10+3*10^2+2*10^3+1*10^4$$

Plus généralement l'écriture en base $b$ d'un nombre : $$(a_pa_{p-1}\dots a_{0})_{|b}=\sum_{k=0}^p a_kb^k$$

Les entiers positifs

Q1 Passer d'une écriture en base 2 à la base 10 :

Q1a Combien vaut $x=01011101_{|2}$ en base 10 ?

Q1b Combien vaut $x=11111111_{|2}$ en base 10 ?

En python on peut utiliser la fonction int(ecriture binaire,2) pour contrôler :

Q2 Passer d'une écriture en base 10 à la base 2 :

Q2a Quelle est l'écriture en base 2 du nombre treize ?

Q2b Connaissez-vous une méthode pour passer de l'écriture décimale d'un entier positif à son écriture binaire ? Si oui l'appliquer pour $n=135_{|10}$

Clic pour indice *Penser à faire des divisions par 2 successives*

Il existe des fonctions pyhton pour faire ce travail. Testez vos résultats...

Q3a Avec $N$ bits, quel est le plus grand nombre que l'on peut obtenir ?

Q3b Par quelle manipulation on peut obtenir le double d'un nombre écrit en base 2 ?

Q3c Comment fait-on pour savoir si un nombre écrit en base 2 est pair ? S'il est pair comment fait-on pour le diviser par 2 ?

Q4 (facultatif) En programmant votre technique de la question Q2, écrire votre propre fonction python dec2bin(value : int) -> list qui renvoie la liste des bits de l'écriture du nombre entier reçu en paramètre (on prendra soin de placer le bit de poids fort en position 0 dans la liste).

 II. Représentation en machine des entiers relatifs

On vient de voir un procédé mathématique qui permet d'écrire un nombre entier positif en n'utilisant que les symboles 0 et 1, ce qui est directement utilisable pour un codage en mémoire machine.

On aimerait trouver un moyen de stocker également des nombres entiers négatifs...

Remarque : En machine, pour représenter un nombre on fixe la longueur de la chaîne, disons à $N$ bits.

Une première idée : avec un bit de signe.

Application numérique :

Pour palier à ces inconvénients on a introduit la deuxième idée suivante :

Deuxième idée : le complément à 2 (ou plus précisément le complément à $2^N$)

Remarque : il existe une méthode simple pour obtenir l'opposé d'un nombre représenté en complément à 2 :

Conséquences :

Vérifions sur un exemple pour comprendre la technique avec $N=4$:

Q5 On fixe dans cette question $N=8$ (un octet).

Q5a Quelle est l'écriture binaire de -1?

Q5b Donner les représentations en complément à 2 des nombre 35, -35, 20 et -20 (on pourra vérifier les résultats avec la fonction python donnée dans la cellule suivante...)

Q5b Poser ensuite l'addition binaire de 35 + (-20) et vérifier que l'on obtient bien la représentation de 15

Q5d Poser alors l'addition binaire de (-35) + 20 et vérifier que l'on obtient aussi la représentation de -15

Q5e Quel est le plus grand entier positif que l'on peut représenter avec $N=8$? Quelle est son écriture binaire?

Q5f Quel est le plus petit entier négatif que l'on peut représenter avec $N=8$? Quelle est son écriture binaire?

Q5g Soit $x=1000\,0000_{|2}$. Quelle est l'écriture de $x$ en base 10 ? Appliquer la technique du complément à 2 pour déterminer l'écriture binaire de $-x$. Que constate-t-on ?

Exercice

Un exercice pour essayer de bien maîtriser la notion de complément à 2.

Remarque : on fait le choix dans cet exercice de stocker les bits d'une représentation binaire dans une liste python (on aurait aussi pu travailler avec des chaînes de caractères...)

Q1 Écrire une fonction  add_bits(b1,b2,r0) qui renvoie le couple (b,r)qui est le résultat (avec retenue) de l'addition des deux bits b1 et b2 avec la retenue b0

Q2 Écrire une fonction add(L1,L2) qui réalise l'addition binaire de deux entiers positifs représentés par les listes L1 et L2 (attention s'assurer que les tailles des listes soient identiques, et on augmentera éventuellement la taille de 1 pour le résultat en cas de retenue...)

Q3 Écrire une fonction compla2(L : list,N : int) -> list qui reçoit une liste L représentant un entier relatif $x$ codé sur N bits et renvoie l'écriture de $-x$ avec la convention du complément à 2

Q4 Écrire enfin une fonction python conv10to2Z(x : int, n : int) -> list qui prend un entier relatif $x$ et un entier $n$ strictement positif en arguments et retourne la liste de longueur $n$ contenant les bits de $x$ en binaire avec la convention du complément à 2 (elle fait la même chose que two_complement_representation croisée précédemment)