- Accueil
- TUTORIELS
- ARCHITECTURE DES ORDINATEURS
- CODAGE DES NOMBRES
- Pourquoi tout finit en 0 et en 1
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.
| Taille | Combinaisons | Valeurs couvertes | Usage courant |
|---|---|---|---|
| 8 bits | 256 | 0 à 255 | un caractère, une composante de couleur |
| 16 bits | 65 536 | 0 à 65 535 | un numéro de port réseau |
| 32 bits | 4 294 967 296 | 0 à 4 294 967 295 | une adresse IPv4, un compteur |
| 64 bits | environ 1,8×1019 | 0 à 18 446 744 073 709 551 615 | une 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.
| Binaire | Hexa | Binaire | Hexa | Binaire | Hexa | Binaire | Hexa |
|---|---|---|---|---|---|---|---|
| 0000 | 0 | 0100 | 4 | 1000 | 8 | 1100 | C |
| 0001 | 1 | 0101 | 5 | 1001 | 9 | 1101 | D |
| 0010 | 2 | 0110 | 6 | 1010 | A | 1110 | E |
| 0011 | 3 | 0111 | 7 | 1011 | B | 1111 | F |
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.
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
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.
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.
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.
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
Ajouter un commentaire