☀️ Stage Pré-rentrée · dès le 24 aoûtRéserver ma place →
Majorant
📘 Fiche de cours · 1re année📐 MPSI💻 Informatique Informatique communeNiveau · Sup

Représentation des entiers et des flottants

Comment la machine code les nombres : les entiers en base 2 et le complément à deux, le débordement (absent en Python), et surtout les flottants — pourquoi 0.1 + 0.2 ne vaut pas 0.3 et pourquoi on ne compare jamais deux flottants avec == mais avec abs(a-b) < epsilon — avec trois exercices corrigés.

Fiche rédigée par les mentors Majorant — alumni Polytechnique, CentraleSupélec et Mines Paris.

3 définitionsMis à jour le 2026-08-02

Vue d'ensemble

Une machine ne connaît que des 0 et des 1. Pour qu'un ordinateur manipule le nombre ou le nombre , il faut d'abord le coder avec des bits. Ce chapitre explique comment : les entiers en base 2, les entiers négatifs par complément à deux, et pourquoi les nombres à virgule (les flottants) réservent des surprises — au point que 0.1 + 0.2 ne vaut pas 0.3 pour l'ordinateur.

Au programme (BO 2021, Sup) — Représentation binaire des entiers naturels ; représentation des entiers relatifs (complément à deux, taille fixe) ; notion de débordement ; représentation approchée des réels par des flottants ; conséquences sur la comparaison de flottants. Les entiers de Python sont de taille arbitraire : le complément à deux et le débordement concernent les entiers de taille fixe (processeur, langage C).

Prérequis

  • Variables, types et affectations (types int et float).
  • Boucles for et while.
  • Les puissances de 2 :
🎯 Accompagnement Majorant

La représentation des nombres piège tout le monde en début de prépa. Comprendre vraiment pourquoi 0.1+0.2 échoue vous évitera des heures de bugs incompréhensibles ; nos mentors alumni X · Centrale · Mines vous font manipuler ces notions jusqu'au réflexe.

Trouver un mentor →

Les entiers naturels en base 2

En base 10, l'écriture signifie . En base 2, on n'utilise que les chiffres 0 et 1, et chaque position vaut une puissance de 2. De droite à gauche, les poids sont .

Définition 1.1 — Bit et base 2
Un bit (binary digit) est un chiffre valant 0 ou 1. Un entier naturel écrit en base 2 sous la forme (avec chaque ) représente le nombre . Le bit (à droite) est le bit de poids faible, le bit (à gauche) le bit de poids fort.

Ainsi .

Convertir un entier décimal en binaire

Méthode par les poids : on parcourt les poids du plus grand au plus petit ; à chaque poids, on regarde s'il « tient » dans ce qu'il reste. Traçons-la sur .

Conversion de 13 en binaire par soustraction des poids
Poids testéPoids ≤ reste ?BitReste après
813 ≥ 8 → oui113 − 8 = 5
45 ≥ 4 → oui15 − 4 = 1
21 ≥ 2 → non01
11 ≥ 1 → oui10 → fini, 1101 ✓

En lisant la colonne « Bit » de haut en bas : .

📐 Méthode — Décimal vers binaire (poids décroissants)
  1. Lister les poids jusqu'au plus grand nombre.
  2. Du plus grand poids au plus petit : si le poids reste, écrire un 1 et soustraire ce poids ; sinon écrire un 0.
  3. Le binaire est la suite des bits, du premier écrit (poids fort) au dernier (poids faible).

En Python : bin() et int()

Python fournit deux outils tout prêts pour passer d'une écriture à l'autre.

print(bin(13))        # decimal -> binaire
print(int("1101", 2)) # binaire (texte) -> decimal
print(bin(6))         # autre exemple
🔍 Décryptage ligne par ligne
bin(13)Renvoie la chaîne '0b1101'. Le préfixe 0b signale « ceci est écrit en base 2 » ; les chiffres utiles sont 1101. C'est bien notre .
int("1101", 2)L'inverse : on donne une chaîne de bits et la base (2), Python renvoie l'entier décimal 13. Le deuxième argument est indispensable : sans lui, int("1101") lirait treize-cent-un en base 10.
bin(6)Affiche '0b110', car . Remarquez que le bit de poids faible est 0 : 6 est pair.

Sortie exacte de ce programme :

0b1101
13
0b110
📝 Lire la parité sur le dernier bit. Un entier est pair si et seulement si son bit de poids faible (le plus à droite) vaut 0. C'est l'analogue binaire du « se termine par 0, 2, 4, 6, 8 » en base 10.

Les entiers relatifs : le complément à deux

Les bits ne « connaissent » pas le signe moins. Sur une machine à taille fixe (un registre de bits), on adopte donc une convention : le complément à deux. Elle a un immense avantage : l'addition des négatifs se fait avec le même circuit que celle des positifs.

Définition 2.1 — Complément à deux sur n bits
Sur bits, un entier positif est codé par son écriture binaire habituelle. Un entier négatif (avec 0 &lt; x \le 2^{n-1}) est codé par le motif binaire du nombre . Le bit de poids fort joue alors le rôle de bit de signe : 0 pour un nombre , 1 pour un nombre &lt; 0.

Exemple sur 8 bits : coder . On calcule , puis on écrit en binaire sur 8 bits.

n = 8
x = 5
code = (2**n - x) % (2**n)   # 256 - 5 = 251
print(format(code, "08b"))   # ecrit 251 sur 8 bits
🔍 Décryptage ligne par ligne
n = 8 ; x = 5On travaille sur 8 bits et on veut coder , donc .
(2**n - x) % (2**n)Le cœur du complément à deux : . Le % (2**n) ramène le résultat dans (utile quand , où l'on veut 0 et non 256).
format(code, "08b")Convertit 251 en binaire sur exactement 8 caractères (le 08 complète avec des zéros à gauche). Résultat : 11111011.

Sortie : 11111011. Le bit de poids fort vaut 1 : c'est bien un nombre négatif. Vérification : , et .

💡 Les bornes sur bits. Avec bits en complément à deux, on représente exactement les entiers de l'intervalle . Sur 8 bits : . Sur 4 bits : . Un côté a un de plus (il n'y a qu'un seul zéro, du côté positif).

Le débordement (overflow)

Sur taille fixe, dépasser la borne haute fait « repartir » du bas : c'est le débordement. Sur 8 bits, ajouter 1 à (soit ) donne , qui vaut en complément à deux — un positif est devenu négatif ! C'est un bug classique en langage C.

⚠ En Python, pas de débordement natif. Les entiers Python (int) sont de taille arbitraire : ils grandissent tant qu'il reste de la mémoire. 2**100 se calcule sans problème. Le complément à deux et le débordement décrits ici concernent les entiers de taille fixe du processeur (et des langages comme C, Java). Connaître ces notions reste au programme, car elles expliquent le comportement du matériel.

Les nombres à virgule : les flottants

Pour représenter ou , l'ordinateur utilise des flottants (type float), codés selon la norme IEEE 754. Idée (présentation simplifiée) : un flottant s'écrit

un peu comme la notation scientifique , mais en base 2. La mantisse a un nombre fini de bits : c'est là que naissent tous les problèmes.

Définition 3.1 — Flottant (présentation simplifiée)
Un flottant est une approximation d'un réel de la forme , où la mantisse est codée sur un nombre fixe de bits et l'exposant est un entier. Comme les bits de mantisse sont en nombre fini, seuls certains réels sont représentables exactement ; les autres sont arrondis au flottant le plus proche.
📝 Pourquoi n'est pas exact. En base 10, n'a pas d'écriture décimale finie. En base 2, c'est le nombre (un dixième) qui n'a pas d'écriture binaire finie : , périodique à l'infini. La machine le coupe → elle stocke une valeur très proche mais pas égale.

Le piège central : 0.1 + 0.2

print(0.1 + 0.2)          # la somme affichee
print(0.1 + 0.2 == 0.3)   # le test d'egalite
🔍 Décryptage ligne par ligne
0.1 + 0.20.1 et 0.2 sont déjà stockés arrondis. Leur somme cumule les petites erreurs et donne 0.30000000000000004 — pas tout à fait .
0.1 + 0.2 == 0.3À gauche, 0.30000000000000004 ; à droite, le flottant stocké pour 0.3, qui est encore une autre approximation. Les deux motifs de bits diffèrent → le test renvoie False.

Sortie exacte :

0.30000000000000004
False
⚠ Ne JAMAIS comparer deux flottants avec ==. Le résultat dépend d'erreurs d'arrondi invisibles. C'est la règle d'or du calcul flottant.

La bonne façon de comparer

On teste si les deux nombres sont suffisamment proches, à une tolérance (epsilon) près.

a = 0.1 + 0.2
b = 0.3
epsilon = 1e-9
print(abs(a - b) < epsilon)   # comparaison correcte
🔍 Décryptage ligne par ligne
epsilon = 1e-9Une petite tolérance, ici . Deux flottants dont l'écart est inférieur à sont considérés « égaux ».
abs(a - b) < epsilonabs(a - b) est la distance entre les deux nombres. Si elle est plus petite que , on renvoie True. Ici l'écart vaut , largement sous True.

Sortie : True. C'est la comparaison qu'il faut écrire systématiquement pour des flottants.

📐 Méthode — Comparer deux flottants a et b
  1. Choisir une tolérance adaptée (souvent à ).
  2. Calculer l'écart absolu abs(a - b).
  3. Conclure « égaux » si abs(a - b) < epsilon, jamais avec a == b.
🎯 Accompagnement Majorant

Le réflexe epsilon se travaille sur des TP réels. En colle comme aux concours, savoir quand un flottant trahit fait la différence ; nos mentors alumni X · Centrale · Mines vous entraînent sur les vrais pièges d'énoncés.

Trouver un mentor →

Exercices corrigés

Exo 1Aller-retour décimal / binaireFacile

1) Convertir en binaire à la main (méthode des poids). 2) Que renvoient bin(22) et int("10110", 2) ?

Voir la correction détaillée
1) Poids décroissants. Poids ≤ 22 : 16. → bit 1, reste . ? non → 0. → 1, reste . → 1, reste . ? non → 0. On lit , donc . Vérif : . ✓
2) En Python. bin(22) renvoie la chaîne '0b10110' ; int("10110", 2) renvoie l'entier 22. Les deux opérations sont inverses l'une de l'autre.
Exo 2Complément à deux sur 8 bitsIntermédiaire

1) Coder sur 8 bits en complément à deux. 2) Quel entier relatif le motif 11111111 représente-t-il sur 8 bits ? 3) Rappeler l'intervalle représentable sur 8 bits.

Voir la correction détaillée
1) On calcule , puis en binaire sur 8 bits : . Donc est codé 11111010. Le bit de poids fort vaut 1 (négatif). ✓
2) 11111111 vaut en non-signé ; en complément à deux, . C'est le codage de (un motif « tout à 1 » vaut toujours ).
3) Intervalle : .
Exo 3Débogage flottantDifficile

Un étudiant écrit une boucle qui doit s'arrêter quand un compteur flottant atteint :

x = 0.0
while x != 1.0:
    x = x + 0.1
    print(x)

1) Pourquoi cette boucle risque-t-elle de ne jamais s'arrêter ? 2) Corriger le code proprement.

Voir la correction détaillée
1) 0.1 n'est pas représentable exactement. En l'additionnant 10 fois, on obtient une valeur très proche de mais différente ( ou ). Le test x != 1.0 reste alors toujours vrai → boucle infinie. On ne compare jamais des flottants avec == ou !=.
2a) Solution robuste — compter en entiers.
for i in range(10):
    x = (i + 1) * 0.1
    print(x)
On pilote la boucle avec un entier i (exact) et on calcule x à part. Le nombre d'itérations est garanti.
2b) Variante avec tolérance si l'on doit vraiment tester une valeur : remplacer x != 1.0 par abs(x - 1.0) >= 1e-9 comme condition de continuation.

Récap final — Ce qu'il faut absolument retenir

Coche mentalement chaque point : si tu bloques, retourne à la section correspondante avant le quiz.

  • Sais-tu convertir un entier décimal en binaire par la méthode des poids () et l'inverse ?
  • Sais-tu que bin(n) renvoie une chaîne '0b...' et que int("...", 2) fait l'inverse ?
  • Sais-tu reconnaître un nombre pair sur son bit de poids faible (dernier bit = 0) ?
  • Sais-tu coder un négatif en complément à deux sur bits via , et lire le signe sur le bit de poids fort ?
  • Connais-tu l'intervalle représentable sur bits : (donc sur 8 bits) ?
  • Sais-tu ce qu'est le débordement, et qu'en Python les entiers sont de taille arbitraire (pas de débordement natif) ?
  • Sais-tu expliquer pourquoi 0.1 + 0.2 == 0.3 renvoie False ?
  • As-tu le réflexe de comparer deux flottants par abs(a - b) < epsilon et jamais par == ?

Débloque la fiche complète

Théorèmes, démonstrations à savoir refaire, méthodes-types et pièges de concours : crée ton compte gratuit pour tout lire. Une seule fois pour toutes les fiches et ressources Majorant.

Gratuit · vos données restent confidentielles.

Valide tes acquis

Quiz — Représentation des nombres

10 questions · une à la fois · seuil de maîtrise 80 %.

Informatique commune · SupQuiz — Représentation des entiers et des flottantsQuestion 1 / 10
FacileChoix unique1 pt

Quelle est la valeur décimale de l'entier écrit 1011 en base 2 ?

Sélectionne une réponse pour valider.

Fiches associées

📐 MPSI·Informatique

Recherche par dichotomie

La recherche dichotomique dans un tableau trié, expliquée ligne par ligne : code Python commenté, exécution pas à pas, preuve de terminaison et de correction (variant \(d-g\), invariant de boucle), version récursive et complexité \(O(\log n)\).

📐 MPSI·Informatique

Variables, types et affectations

Les briques de base de Python pour bien démarrer la prépa : affectation, types int/float/bool/str, conversions, opérateurs (/ // %), f-strings — avec les pièges classiques et deux exercices corrigés.

📐 MPSI·Informatique

Conditions et booléens

Faire choisir un programme : booléens, comparaisons, if / elif / else, rôle de l'indentation, et combinaison de conditions avec and / or / not — avec pièges et exercices corrigés.

📐 MPSI·Informatique

Boucles for et while

Répéter une action : boucle for avec range, boucle while qui termine, et le motif de l'accumulateur (somme, compteur) — avec table de trace, pièges et exercices corrigés.

📐 MPSI·Informatique

Fonctions : paramètres et valeurs de retour

Définir et appeler une fonction, comprendre paramètres et valeur de retour, et surtout ne jamais confondre return (renvoie) et print (affiche) — avec pièges et exercices corrigés.

📐 MPSI·Informatique

Listes et chaînes de caractères

Créer, indexer, parcourir et découper des listes et des chaînes ; comprendre qu'une liste est modifiable et une chaîne non — avec les pièges d'indices et deux exercices corrigés.

Tu veux aller plus loin sur ce chapitre ?

Nos mentors alumni de Polytechnique, CentraleSupélec et Mines Paris t'accompagnent en cours particuliers — démonstrations détaillées, exos type concours, oraux blancs.

Trouver un mentor →