CHAPITRE 1 : POURQUOI TOUT FINIT EN 0 ET EN 1

Un processeur ne sait pas ce qu'est un nombre. Il ne sait qu'une chose : un fil porte du courant, ou il n'en porte pas. Tout le reste, les entiers, les prix en francs CFA, les coordonnées GPS, les couleurs d'une photo, n'est qu'une convention posée au-dessus de cette alternative. Ce premier chapitre pose les fondations : ce qu'est un bit, comment on écrit un entier positif avec des bits, et pourquoi une suite de bits n'a aucune signification tant qu'on n'a pas dit comment la lire.

Le bit, l'octet, le mot

À l'intérieur d'une machine, l'information circule sous forme de tensions électriques. Pour que le circuit soit fiable et bon marché, les concepteurs n'ont retenu que deux états : tension haute et tension basse. On les note 1 et 0. Cette unité minimale d'information s'appelle le bit, contraction de l'anglais binary digit.

Un bit tout seul ne dit pas grand-chose : deux possibilités. On les regroupe donc.

  • Un octet (byte en anglais) vaut 8 bits. Il offre 28 = 256 combinaisons différentes.
  • Un mot est la quantité de bits que le processeur manipule d'un seul coup. Sur les machines courantes aujourd'hui, c'est 64 bits ; c'était 32 bits il y a vingt ans, 8 bits sur les premiers micro-ordinateurs.

Avec n bits, on dispose de 2n motifs différents, ni plus, ni moins. Tout le reste du cours consiste à décider quoi faire de ces motifs.

Le binaire pur : coder un entier positif

La façon la plus simple d'utiliser des bits est la même que celle dont nous écrivons les nombres en base dix, mais avec deux chiffres au lieu de dix.

En base dix, le nombre 2 026 veut dire 2×103 + 0×102 + 2×101 + 6×100. Chaque position porte une puissance de dix.

En base deux, c'est pareil avec des puissances de deux. Le motif 00101101 se lit :

0×27 + 0×26 + 1×25 + 0×24 + 1×23 + 1×22 + 0×21 + 1×20 = 32 + 8 + 4 + 1 = 45

Dans la pratique on ne récite pas toute la formule : on repère les positions qui portent un 1 et on additionne leurs poids. Les poids d'un octet, de gauche à droite, sont 128, 64, 32, 16, 8, 4, 2, 1. Il suffit de les connaître par cœur.

Vocabulaire. Le bit le plus à gauche porte le poids le plus fort : on l'appelle le bit de poids fort, ou MSB (Most Significant Bit). Celui de droite est le bit de poids faible, ou LSB (Least Significant Bit). Ces deux sigles reviendront à chaque chapitre.

Dans l'autre sens : du décimal au binaire

Pour écrire 45 en binaire, on divise par 2 autant de fois que nécessaire et on garde les restes, qu'on lit de bas en haut.

45 : 2 = 22  reste 1   ← LSB
22 : 2 = 11  reste 0
11 : 2 =  5  reste 1
 5 : 2 =  2  reste 1
 2 : 2 =  1  reste 0
 1 : 2 =  0  reste 1   ← MSB

on remonte : 101101    soit 00101101 sur un octet

Vérification immédiate : 32 + 8 + 4 + 1 = 45. C'est bien cela.

Il existe une seconde méthode, souvent plus rapide à la main : on retranche les poids du plus grand au plus petit. 45 contient-il 32 ? Oui, il reste 13. Contient-il 16 ? Non. 8 ? Oui, il reste 5. 4 ? Oui, il reste 1. 2 ? Non. 1 ? Oui, il reste 0. On a bien 00101101.

Quelle étendue pour combien de bits ?

En binaire pur, tous les motifs servent à représenter des entiers positifs. Sur n bits, on couvre donc exactement de 0 à 2n − 1.

TailleCombinaisonsValeurs couvertes Usage courant
8 bits2560 à 255 un caractère, une composante de couleur
16 bits65 5360 à 65 535 un numéro de port réseau
32 bits4 294 967 2960 à 4 294 967 295 une adresse IPv4, un compteur
64 bitsenviron 1,8×1019 0 à 18 446 744 073 709 551 615une adresse mémoire

Cette table explique beaucoup de bornes que l'on croise sans comprendre d'où elles sortent. Si un formulaire refuse un nombre au-delà de 65 535, ce n'est pas un caprice du programmeur : c'est que la valeur est rangée sur deux octets.

L'hexadécimal : une sténographie du binaire

Écrire 11010011 est pénible et source d'erreurs. Comme 16 = 24, un chiffre hexadécimal remplace exactement quatre bits, sans aucun calcul : il suffit de découper par paquets de quatre en partant de la droite.

BinaireHexaBinaireHexa BinaireHexaBinaireHexa
000000100410008 1100C
000110101510019 1101D
00102011061010A 1110E
00113011171011B 1111F

Ainsi 1101 0011 devient D3, et un octet tient toujours en deux chiffres hexadécimaux. C'est pour cette raison que les couleurs du web s'écrivent #E2571E et les adresses mémoire 0x7FFD.

Arbre de choix du codage : une suite de bits peut representer un entier positif en binaire pur, un entier relatif en complement a deux, ou un nombre reel en virgule flottante.

Le point le plus important du cours

Reprenons le motif 11010011. Combien vaut-il ?

La question n'a pas de réponse. Elle est mal posée. Ce motif vaut :

  • 211 si on le lit en binaire pur ;
  • −83 si on le lit en signe et valeur absolue ;
  • −44 si on le lit en complément à 1 ;
  • −45 si on le lit en complément à 2 ;
  • le caractère Ó si on le lit comme du texte Latin-1 ;
  • une nuance de rouge sombre si c'est une composante de couleur.

La mémoire ne contient aucune étiquette qui dirait laquelle de ces lectures est la bonne. C'est le type déclaré dans le programme qui tranche. Quand un langage comme le C vous laisse convertir un unsigned char en char, il ne modifie pas un seul bit : il change seulement la convention de lecture. Et la valeur affichée change du tout au tout.

Ce qu'il faut retenir

  • Un bit vaut 0 ou 1 ; un octet en contient 8, donc 256 combinaisons.
  • En binaire pur, chaque position porte une puissance de 2 ; sur n bits on couvre 0 à 2n − 1.
  • Décimal vers binaire : divisions successives par 2, restes lus de bas en haut.
  • Un chiffre hexadécimal remplace exactement 4 bits, sans calcul.
  • Un motif binaire n'a aucune valeur en soi. Il faut d'abord choisir une convention de lecture, c'est l'objet des chapitres suivants.

Exercices d'application

Exercice 1

Convertissez 173 en binaire sur 8 bits, puis donnez son écriture hexadécimale.

Voir le corrigéMasquer le corrigé

Par soustraction des poids : 173 − 128 = 45 ; 45 − 32 = 13 ; 13 − 8 = 5 ; 5 − 4 = 1 ; 1 − 1 = 0.

Les poids retenus sont 128, 32, 8, 4 et 1, donc 10101101.

Découpage par quatre : 1010 = A et 1101 = D, soit AD en hexadécimal.

Contrôle : 10×16 + 13 = 173. C'est juste.

Exercice 2

Un compteur est rangé sur 10 bits. Quelle est la plus grande valeur qu'il peut atteindre ? Que se passe-t-il quand on lui ajoute 1 de plus ?

Voir le corrigéMasquer le corrigé

Sur 10 bits on dispose de 210 = 1 024 motifs, donc les valeurs 0 à 1 023.

1 023 s'écrit 1111111111. En ajoutant 1, la retenue se propage sur toute la largeur et sort du compteur : les dix bits retombent à 0000000000. Le compteur affiche 0.

C'est ce qu'on appelle un débordement. Le bit qui sort n'est pas perdu pour tout le monde : le processeur le range dans un indicateur (flag) de retenue, que le programme peut consulter.

Exercice 3

Le motif 01101001 circule dans un registre. Donnez sa valeur en binaire pur, puis expliquez en une phrase pourquoi la question « combien vaut ce registre ? » reste malgré tout incomplète.

Voir le corrigéMasquer le corrigé

En binaire pur : 64 + 32 + 8 + 1 = 105.

La question est incomplète parce qu'un motif ne porte pas sa propre convention de lecture. Ici le bit de poids fort vaut 0, donc les quatre conventions du cours (binaire pur, signe et valeur absolue, complément à 1, complément à 2) donnent toutes 105, mais c'est une coïncidence due au signe positif. Dès que le bit de poids fort vaut 1, les quatre lectures divergent.

Exercice 4

Posez l'addition 11010011 + 01101110 en binaire pur. Le résultat tient-il sur 8 bits ?

Voir le corrigéMasquer le corrigé
  11010011   (211)
+ 01101110   (110)
----------
 101000001   (321)

Le résultat occupe 9 bits : 321 dépasse 255, la plus grande valeur d'un octet non signé.

Sur une machine 8 bits, le neuvième bit sort du registre : il ne reste que 01000001, soit 65. Et 321 − 256 = 65 : le résultat est juste modulo 256, ce qui n'est une consolation que si le programme le sait.

Posez le calcul sur une feuille avant d'ouvrir le corrigé : le codage s'apprend au crayon, pas en lecture.

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
★ ★ ★ ★ ★
2 votes. Moyenne 5 sur 5.

Ajouter un commentaire

Anti-spam