cours1 min de lecture

Bases de numération et entiers positifs

Comment écrire un nombre en binaire, en hexadécimal ou en octal, et comment convertir d'une base à l'autre.
programme

Introduction

Quand vous écrivez 2026, vous utilisez sans y penser une convention : chaque chiffre occupe une position qui correspond à une puissance de 10. La position des unités vaut 10010^0, celle des dizaines 10110^1, celle des centaines 10210^2, et ainsi de suite. C'est la base 10, ou notation décimale.

Un ordinateur, lui, ne distingue physiquement que deux états : courant qui passe ou non, aimantation positive ou négative, tension haute ou basse. Il est donc naturel qu'il travaille en base 2 : il n'utilise que deux chiffres, 0 et 1, appelés bits (binary digit). Pour faciliter la lecture humaine de ces longues suites de bits, on utilise aussi la base 16 (hexadécimal) et, plus rarement, la base 8 (octal).

Le principe d'une base bb

Dans une base bb (avec b2b \geq 2), on dispose de bb chiffres distincts, allant de 00 à b1b-1. Un nombre s'écrit comme une suite de ces chiffres, et la valeur du nombre se calcule en sommant chaque chiffre multiplié par la puissance de bb correspondant à sa position.

Pour un nombre noté (cn1cn2c1c0)b(c_{n-1} c_{n-2} \ldots c_1 c_0)_b dans la base bb (les cic_i étant les chiffres, à ne pas confondre avec la base bb) :

N=i=0n1cibiN = \sum_{i=0}^{n-1} c_i \cdot b^i
BaseNomChiffres utilisésPréfixe Python
2binaire0, 10b
8octal0 à 70o
10décimal0 à 9aucun
16hexadécimal0 à 9, puis A à F0x

En hexadécimal, les lettres A à F représentent les valeurs 1010 à 1515. Ainsi, B vaut 1111 et F vaut 1515.

Pour lever toute ambiguïté, on note souvent la base en indice : (1011)2(1011)_2 pour le binaire, (2B)16(2B)_{16} pour l'hexadécimal. En Python, les préfixes 0b, 0o et 0x jouent le même rôle.

Du binaire au décimal

Pour convertir une écriture binaire en décimal, on somme les puissances de 2 correspondant aux bits valant 1.

Exemple : convertir (1011)2(1011)_2.

(1011)2=123+022+121+120=8+0+2+1=11(1011)_2 = 1 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^1 + 1 \cdot 2^0 = 8 + 0 + 2 + 1 = 11

Python sait faire cette conversion automatiquement grâce à int() avec sa base passée en second argument :

print(int("1011", 2))  # 11
print(int("FF", 16))   # 255
print(int("17", 8))    # 15

Que vaut (1101)2(1101)2(1101)2​ en décimal ?

Du décimal au binaire — les divisions successives

Pour passer du décimal au binaire, on divise le nombre par 2 et on note le reste. On répète l'opération sur le quotient jusqu'à obtenir 0. La lecture des restes de bas en haut donne l'écriture binaire.

Exemple : convertir 1313 en binaire.

DivisionQuotientReste
13÷213 \div 2661\mathbf{1}
6÷26 \div 2330\mathbf{0}
3÷23 \div 2111\mathbf{1}
1÷21 \div 2001\mathbf{1}

En lisant les restes de bas en haut : 13=(1101)213 = (1101)_2.

⏵ Ctrl+↵ pour exécuter
Aucune exécution pour l'instant.

Sortie attendue :

13 en binaire : 0b1101
13 en hexadécimal : 0xd
13 en octal : 0o15

Le pont avec l'hexadécimal

L'hexadécimal a un atout précieux : chaque chiffre hexadécimal correspond exactement à 4 bits. La conversion binaire ↔ hexadécimal se fait donc par blocs, sans aucun calcul.

HexBinaireHexBinaire
0000081000
1000191001
20010A1010
30011B1011
40100C1100
50101D1101
60110E1110
70111F1111

Exemple : (2F)16=(0010 1111)2=47(2F)_{16} = (0010\ 1111)_2 = 47.

C'est pour cela qu'on rencontre l'hexadécimal partout en informatique : adresses mémoire, couleurs CSS (#FF8800), valeurs d'un octet… Lire un octet en hexadécimal, c'est lire 2 chiffres au lieu de 8 bits.

Combien de bits sont nécessaires pour écrire (A3)16(A3)(A3)16​ ?

Combien de bits pour un nombre ?

Avec nn bits, on peut représenter 2n2^n valeurs différentes, soit les entiers de 00 à 2n12^n - 1.

BitsValeurs représentablesMaximum
424=162^4 = 161515
8 (octet)28=2562^8 = 256255255
16216=655362^{16} = 65\,5366553565\,535
322324,31092^{32} \approx 4{,}3 \cdot 10^9environ 4 milliards

Inversement, pour écrire un entier NN positif, il faut log2(N)+1\lfloor \log_2(N) \rfloor + 1 bits. En pratique, vous pouvez aussi compter en utilisant bin(N) :

n = 1000
print(bin(n))            # 0b1111101000
print(len(bin(n)) - 2)   # 10 — on retire le préfixe "0b"

Pièges courants

  • Ne pas confondre la base et le nombre de chiffres. (10)2(10)_2 vaut 22, pas dix.
  • En Python, 0b10 est un entier dont la valeur est 22. Quand vous l'affichez avec print(0b10), Python affiche 22 en décimal par défaut.
  • L'écriture 010 dans un code Python ancien (Python 2) était un octal — source de bugs. En Python 3, il faut écrire 0o10 explicitement.

Pour aller plus loin

Python gère les entiers de taille arbitraire : vous pouvez calculer 210002^{1000} sans erreur, contrairement à beaucoup d'autres langages où les entiers sont bornés à 32 ou 64 bits. Vous reverrez cette notion dans le cours suivant sur les entiers relatifs.