FlowingDev

Les Bases Numériques, Expliquées : Pourquoi les Ordinateurs Comptent Bizarrement

Apprenez comment les systèmes de bases numériques comme le binaire, l'octal, le décimal et l'hexadécimal fonctionnent pour représenter le même nombre de différentes manières, un concept clé en informatique.

Essayer l'outil: Base Converter

En une phrase

La conversion de base numérique, c'est l'art de traduire un nombre d'un système de comptage (comme notre bon vieux système décimal à dix chiffres) à un autre (comme le binaire à deux chiffres, la langue maternelle de l'ordinateur), sans changer sa valeur réelle.

Le problème que ça résout

Les humains, pour la plupart, ont dix doigts. Ce hardware biologique a rendu le comptage par groupes de dix — le système décimal ou base 10 — incroyablement naturel. On a dix symboles uniques (de 0 à 9), et une fois qu'on arrive à neuf, on repart à zéro : on ajoute un nouveau chiffre à gauche et on recommence. Dix, c'est 10, cent, c'est 100, et ainsi de suite. Fastoche.

Les ordinateurs, par contre, ont des « doigts » différents. Leur composant fondamental est le transistor, un interrupteur microscopique qui peut être soit allumé (on), soit éteint (off). C'est tout. Deux états. Ça fait d'un système à deux symboles — le binaire ou base 2 — la langue maternelle de l'ordinateur. Les deux symboles sont 0 (off) et 1 (on).

Ça crée un problème de traduction. Pour un ordinateur, le nombre humain 237 ne veut rien dire. Il doit être représenté comme une série de « on » et de « off ». Ce même nombre, 237, en binaire, s'écrit 11101101.

Alors que les ordinateurs parlent couramment le binaire, les humains... pas vraiment. Lire une longue chaîne de uns et de zéros, c'est la recette parfaite pour un mal de crâne et des yeux qui piquent. Pour combler ce fossé, les développeurs ont inventé des raccourcis bien pratiques : l'octal (base 8) et l'hexadécimal (base 16). Ces bases en « puissance de deux » sont triviales à convertir depuis et vers le binaire, mais elles compressent de longues chaînes binaires en morceaux beaucoup plus lisibles.

Les bases numériques existent pour résoudre cette incompatibilité fondamentale entre la façon dont les humains pensent les nombres et la façon dont les machines les stockent physiquement. Elles sont la pierre de Rosette qui nous permet de jeter un œil dans l'esprit de la machine sans se perdre dans un océan de uns et de zéros.

Comment ça marche sous le capot

La magie derrière n'importe quelle base numérique est un concept appelé la notation positionnelle. La position d'un chiffre détermine sa valeur. Décortiquons ça.

C'est quoi une « base », au juste ?

Pensez au compteur kilométrique de votre voiture. Quand le chiffre le plus à droite passe de 9 à 0, le chiffre à sa gauche augmente de un. La « place » de chaque chiffre représente une puissance de dix.

Le nombre 427 dans notre système quotidien en base 10 signifie en réalité :

  • 4 centaines (4 × 10²)
  • 2 dizaines (2 × 10¹)
  • 7 unités (7 × 10⁰)

Additionnez-les : 400 + 20 + 7 = 427.

Une « base », c'est juste le nombre que l'on élève à une puissance pour chaque position. Pour la base 10, c'est 10. Pour le binaire (base 2), c'est 2. Pour l'hexadécimal (base 16), c'est 16. La formule est la même, seule la base (b) change :

... + (chiffre × b²) + (chiffre × b¹) + (chiffre × b⁰)

De notre monde (décimal) au leur (n'importe quelle base)

Convertissons notre nombre décimal 427 en binaire (base 2). L'algorithme consiste à « diviser à plusieurs reprises par la base cible et noter le reste ».

Division Résultat Reste
427 ÷ 2 213 1
213 ÷ 2 106 1
106 ÷ 2 53 0
53 ÷ 2 26 1
26 ÷ 2 13 0
13 ÷ 2 6 1
6 ÷ 2 3 0
3 ÷ 2 1 1
1 ÷ 2 0 1

Maintenant, lisez les restes en partant du bas vers le haut.

Donc, le nombre décimal 427 est 110101011 en binaire.

Cette méthode fonctionne pour n'importe quelle base. Pour convertir 427 en hexadécimal (base 16), il suffit de diviser par 16. (Note : en base 16, on a besoin de plus de 10 symboles, donc on utilise A pour 10, B pour 11, ..., jusqu'à F pour 15).

  • 427 ÷ 16 = 26 avec un reste de 11 (soit B en hexa).
  • 26 ÷ 16 = 1 avec un reste de 10 (soit A en hexa).
  • 1 ÷ 16 = 0 avec un reste de 1.

En lisant de bas en haut, on obtient 1AB. Donc, le nombre décimal 427 est 1AB en hexa.

De leur monde (n'importe quelle base) au nôtre (décimal)

Pour faire le chemin inverse, on utilise la formule de notation positionnelle vue plus haut. Reconvertissons le binaire 110101011 en décimal. On multiplie chaque chiffre par 2 élevé à la puissance de sa position (en partant de 0 à droite).

  1 * 2^8 = 256
+ 1 * 2^7 = 128
+ 0 * 2^6 = 0
+ 1 * 2^5 = 32
+ 0 * 2^4 = 0
+ 1 * 2^3 = 8
+ 0 * 2^2 = 0
+ 1 * 2^1 = 2
+ 1 * 2^0 = 1
----------------
Total     = 427

Ça marche ! Essayons avec l'hexa 1AB :

  1 * 16^2 = 256
+ A * 16^1 = (10 * 16) = 160
+ B * 16^0 = (11 * 1)  = 11
-------------------------
Total      = 427

Et bim. Le même nombre, mais avec des costumes différents.

Le raccourci de l'hexa et de l'octal

Alors pourquoi s'embêter avec l'hexadécimal et l'octal ? Parce que ce sont des bases en « puissance de deux ».

  • L'octal est en base 8, et 8 = 2³. Ça signifie que chaque chiffre octal correspond parfaitement à un groupe de trois chiffres binaires.
  • L'hexa est en base 16, et 16 = 2⁴. Ça signifie que chaque chiffre hexa correspond parfaitement à un groupe de quatre chiffres binaires (appelé un « nibble » ou quartet).

Prenons un grand nombre binaire : 1101011101001111 Pour le lire, un humain doit scanner chaque chiffre. Mais pour le convertir en hexa, il suffit de le découper en paquets de quatre en partant de la droite :

1101 | 0111 | 0100 | 1111

Maintenant, convertissons chaque paquet :

  • 1101 fait 8+4+0+1 = 13, soit D
  • 0111 fait 0+4+2+1 = 7
  • 0100 fait 0+4+0+0 = 4
  • 1111 fait 8+4+2+1 = 15, soit F

Donc, 1101011101001111 est simplement D74F en hexa. Infiniment plus lisible et moins sujet aux erreurs. Ce n'est pas juste un calcul ; c'est une transcription directe. Voilà pourquoi les développeurs adorent l'hexadécimal : c'est l'enveloppe parfaite et lisible par un humain pour des données binaires.

Histoires vécues

L'affaire de la couleur cryptique

Un développeur front-end junior reçoit une maquette d'un designer UI. La couleur principale de la marque est indiquée comme #E63946. Le développeur sait que c'est une nuance de rouge, mais combien de rouge ? Et quid des autres couleurs ? Il balance le code hexa dans un convertisseur. E63946 est en fait trois nombres hexadécimaux distincts : E6 pour le Rouge, 39 pour le Vert et 46 pour le Bleu.

  • E6 en hexa se convertit en 230 en décimal. OK, donc c'est beaucoup de rouge (sur un maximum de 255).
  • 39 en hexa se convertit en 57 en décimal. Un peu de vert.
  • 46 en hexa se convertit en 70 en décimal. Un peu de bleu.

En décomposant le code hexa, le développeur comprend la composition de la couleur. Ce n'est pas juste du « rouge », c'est « principalement du rouge, avec une petite quantité similaire de vert et de bleu pour le rendre moins criard ».

La morale de l'histoire : L'hexadécimal est le langage de la couleur sur le web. Le comprendre vous aide à aller au-delà du copier-coller de codes et à vraiment saisir les couleurs avec lesquelles vous travaillez.

L'énigme des permissions de fichiers

Un admin sys essaie de sécuriser un script fraîchement uploadé, deploy.sh, sur un serveur Linux. Il faut que le propriétaire puisse le lire, l'écrire et l'exécuter, mais que le groupe et tous les autres ne puissent que le lire et l'exécuter. Il a vu la commande chmod 755 deploy.sh utilisée partout, mais il l'a toujours considérée comme une formule magique.

Cette fois, il se renseigne. Le nombre 755 est en octal. Il représente trois ensembles de permissions : Propriétaire, Groupe et Autres.

  • La permission du propriétaire est 7. En binaire, 7 est 111.
  • La permission du groupe est 5. En binaire, 5 est 101.
  • La permission des « autres » est 5. En binaire, 5 est 101.

Chaque chiffre binaire correspond à une permission spécifique : lecture (r), écriture (w) et exécution (x).

  • 111 signifie rwx (Lecture, Écriture, Exécution sont tous ACTIVÉS).
  • 101 signifie r-x (Lecture et Exécution sont ACTIVÉS, Écriture est DÉSACTIVÉE).

Donc, chmod 755 définit les permissions sur rwxr-xr-x, ce qui est exactement ce qu'il fallait. Le mystère était résolu.

La morale de l'histoire : L'octal fournit un raccourci super concis pour gérer les permissions de fichiers, qui sont fondamentalement un ensemble de drapeaux on/off (des bits).

Le bug du bit qui bascule

Un développeur qui conçoit un système embarqué pour un thermostat intelligent doit sauvegarder les paramètres de l'appareil dans une minuscule zone de mémoire. Pour économiser de l'espace, il utilise un seul octet (8 bits) comme un « flag register » (registre de drapeaux). Chaque bit représente un paramètre : isHeating, isCooling, fanOn, hasWifiConnection, etc.

Un jour, les rapports de bug affluent : « Quand j'allume le ventilateur, le chauffage se met en route aussi ! » Le développeur est perplexe. Le code pour allumer le ventilateur semble correct. Mais quand il inspecte l'octet de paramètres en mémoire, il voit le problème. Disons que le ventilateur est le 2ème bit (valeur 2¹ = 2) et le chauffage le 3ème bit (valeur 2² = 4). Le code était censé mettre l'octet à ...010 (ventilateur allumé). Au lieu de ça, il le mettait à ...110 (ventilateur allumé ET chauffage allumé). La valeur décimale aurait été 6 au lieu de 2, ce qui n'est pas immédiatement évident. Mais regarder la représentation binaire 00000110 a rendu le problème limpide : deux bits étaient basculés au lieu d'un. Une opération bitwise foireuse était la coupable.

La morale de l'histoire : Pour la programmation bas niveau, le débogage de la mémoire ou le travail avec les registres matériels, penser en binaire n'est pas une option — c'est la seule façon de voir ce qui se passe réellement.

Erreurs et pièges courants

  • Oublier les préfixes. Dans de nombreux langages de programmation (comme C, Java ou JavaScript), un nombre commençant par 0 est interprété comme de l'octal. 010 n'est pas dix, c'est huit ! Un nombre commençant par 0x est de l'hexadécimal. 0x10 c'est seize. Ignorer cela peut conduire à des bugs vraiment tordus.
  • Confondre O/0 et I/1. Quand on fixe de longues chaînes hexa ou binaires, il est facile de s'embrouiller et de prendre la lettre O pour un zéro, ou I pour un un. L'hexadécimal n'utilise ni O ni I, mais d'autres conversions de base pourraient le faire, et c'est une erreur de frappe classique.
  • Supposer qu'il existe une norme pour les bases > 16. Les caractères pour le binaire (0-1), l'octal (0-7), le décimal (0-9) et l'hexadécimal (0-9, A-F) sont standardisés. Mais qu'en est-il de la base 22 ou de la base 36 ? La plupart des systèmes utilisent 0-9 suivi de A-Z, mais ce n'est pas une loi universelle. Vérifiez toujours le jeu de caractères (ou « alphabet ») utilisé lorsque vous traitez des bases moins courantes.
  • Ignorer les limites des entiers. Un nombre hexadécimal de 64 bits comme 0x7FFFFFFFFFFFFFFF représente un nombre gargantuesque. Si vous essayez de le convertir et de le stocker dans une variable entière standard de 32 bits dans votre programme, ça ne rentrera pas. Cela provoquera un « dépassement d'entier » (integer overflow), où le nombre revient à une valeur négative ou lève une erreur.

Pourquoi ça doit être sur votre radar

Même si vous n'êtes pas un programmeur C bas niveau, vous tomberez constamment sur différentes bases numériques. Vous devriez y penser chaque fois que vous :

  • Choisissez une couleur en CSS ou dans un outil de design (#RRGGBB).
  • Manipulez des valeurs de hachage comme les clés d'API ou les SHA de commits Git, qui sont presque toujours en hexa.
  • Définissez les permissions sur un serveur web (chmod).
  • Travaillez avec des formats de données de bas niveau, des protocoles réseau ou tout ce qui utilise des masques de bits (par ex., les feature flags).
  • Tombez sur des codes d'erreur ou des adresses mémoire dans un débogueur.
  • Essayez de comprendre comment les ordinateurs fonctionnent vraiment. C'est un concept fondamental qui démystifie une bonne partie de la magie numérique.

Pour aller plus loin

  • Positional Notation (Wikipedia) : L'explication académique et détaillée de la théorie derrière tous les systèmes de bases numériques.
  • Hexadecimal (Wikipedia) : Un excellent résumé de la base 16, son histoire et ses usages courants en informatique.
  • **MDN Web Docs: <color> : Le guide de référence du développeur web sur les valeurs de couleur CSS, incluant une explication approfondie de la notation hexa (#RRGGBB).
  • chmod manual page : Le manuel de référence Linux pour la commande chmod, qui détaille l'utilisation de l'octal pour définir les permissions de fichiers.
  • Bitwise operations in JavaScript (MDN) : Un guide pratique qui montre comment les manipulations au niveau du bit sont effectuées dans un langage de haut niveau, un scénario courant pour appliquer ses connaissances de la base 2.

Théorie bouclée. Place à la pratique — 100 % dans ton navigateur.

Essayer l'outil: Base Converter