Valeur maximale d’un entier - limites et débordements

Noël Besnard .

17 septembre 2026

Infographie expliquant l'overflow d'entiers, ses limites, et comment il est géré dans divers langages. L'int max est abordé.

Un compteur qui passe soudainement d’une valeur positive à une valeur négative peut provoquer bien plus qu’un simple affichage étrange. La valeur maximale d’un entier dépend du langage, du nombre de bits et du caractère signé ou non du type. Je présente ici les limites utiles, les méthodes pour les vérifier et les précautions à prendre pour éviter les débordements.

La borne dépend du type et du langage utilisé

  • Entier signé sur 32 bits : la valeur maximale courante est 2 147 483 647.
  • Entier non signé sur 32 bits : la limite atteint 4 294 967 295.
  • Entier signé sur 64 bits : la borne supérieure est 9 223 372 036 854 775 807.
  • Le dépassement peut provoquer une erreur, un retour à une valeur négative ou une conversion incorrecte.
  • Python adapte automatiquement la taille de ses entiers, contrairement à Java ou C#.

Cercle de nombres binaires de 0000 (0) à 1111 (15), avec une étiquette

Pourquoi la valeur maximale n’est pas toujours la même

En programmation, l’expression int max désigne généralement la plus grande valeur stockable dans un entier de type int. Pourtant, ce nom ne suffit pas à connaître la limite. Je vérifie toujours le langage et l’implémentation avant de choisir un type pour un compteur, un identifiant ou une mesure.

Pour un entier signé codé sur n bits, la formule habituelle est 2^(n-1) - 1. Un bit sert au signe, ce qui explique pourquoi un entier signé sur 32 bits s’arrête à 2 147 483 647, tandis qu’un entier non signé de même taille peut atteindre 4 294 967 295.

Type ou langage Valeur maximale courante Point important
int signé sur 32 bits 2 147 483 647 Valeur fréquente en C, C++, Java et C#
unsigned int sur 32 bits 4 294 967 295 Ne stocke pas les valeurs négatives
long ou long long signé sur 64 bits 9 223 372 036 854 775 807 Adapté aux grands compteurs et horodatages
Integer en Java 2 147 483 647 La constante est Integer.MAX_VALUE
Int32 en .NET 2 147 483 647 La constante est Int32.MaxValue
Entier Python Pas de limite fixe pratique La taille augmente selon la mémoire disponible

Le cas du langage C mérite une nuance. Le standard garantit une taille minimale pour int, mais l’environnement moderne le représente généralement sur 32 bits. Pour un comportement prévisible, je préfère utiliser des types de largeur explicite comme int32_t ou int64_t.

Comment connaître précisément la limite dans son code

Écrire directement 2147483647 fonctionne, mais ce n’est pas la meilleure méthode. Une constante fournie par le langage reste plus lisible et évite les erreurs de frappe, surtout lorsque le code doit fonctionner sur plusieurs architectures.

En C et en C++

En C, la limite d’un entier signé se lit avec INT_MAX, défini dans . En C++, std::numeric_limits est plus flexible et fonctionne avec différents types numériques.

#include 
#include 

printf("%d\n", INT_MAX);
#include 
#include 

std::cout << std::numeric_limits::max();

Pour un entier non signé, la constante correspondante est UINT_MAX. Je déconseille toutefois de remplacer un type signé par un type non signé uniquement pour gagner quelques valeurs positives, car les comparaisons entre nombres signés et non signés peuvent devenir piégeuses.

En Java et en C#

Java fournit Integer.MAX_VALUE et Integer.MIN_VALUE. En C#, on utilise généralement int.MaxValue ou Int32.MaxValue. Ces constantes indiquent clairement l’intention et rendent le code plus facile à maintenir.

int limiteJava = Integer.MAX_VALUE;
int limiteCSharp = int.MaxValue;

Dans les deux cas, la valeur maximale d’un entier signé sur 32 bits est 2 147 483 647. Pour dépasser cette borne, il faut choisir un type plus large avant le calcul, et pas seulement après l’apparition du problème.

En Python et en JavaScript

Python utilise des entiers dont la taille peut augmenter automatiquement. La variable sys.maxsize ne représente donc pas la limite maximale d’un entier Python, mais la plus grande valeur pratique pour certains index et tailles internes, généralement 263 - 1 sur une machine 64 bits.

JavaScript possède un type Number en virgule flottante. Les entiers restent exacts jusqu’à 9 007 199 254 740 991, soit Number.MAX_SAFE_INTEGER. Pour de plus grandes valeurs entières, j’utilise BigInt, en gardant à l’esprit qu’il ne se mélange pas librement avec Number.

Que se passe-t-il lorsque la limite est dépassée

Le dépassement de capacité, ou overflow, survient lorsqu’un calcul produit une valeur qui ne tient plus dans le type choisi. Le résultat dépend fortement du langage. C’est précisément pour cette raison que je teste les opérations proches de la borne au lieu de supposer que le comportement sera identique partout.

Le retour à une valeur inattendue

Avec un entier signé de 32 bits, ajouter 1 à 2 147 483 647 peut produire -2 147 483 648 dans les langages qui appliquent un retour cyclique. Le bit de poids fort est interprété comme le signe, et le résultat peut ensuite contaminer un index, un montant ou une condition de sécurité.

int valeur = Integer.MAX_VALUE;
int resultat = valeur + 1;
// resultat vaut -2147483648 en Java

En C et C++, le dépassement d’un entier signé peut même relever d’un comportement indéfini. Le compilateur est alors autorisé à optimiser le programme en partant du principe que ce dépassement ne se produit jamais. Les entiers non signés, eux, effectuent généralement un calcul modulo 2n.

Les différences entre les langages

  • Java effectue un retour cyclique pour les opérations entières ordinaires.
  • C# peut effectuer un retour cyclique en contexte unchecked et lever une exception en contexte checked.
  • C et C++ exigent une grande prudence avec les entiers signés, car le résultat peut être indéfini.
  • Python agrandit l’entier automatiquement, mais le calcul finit par être limité par la mémoire et les performances.
  • JavaScript peut perdre la précision avant même d’atteindre une limite de stockage classique.

Une valeur qui ne déclenche pas d’erreur n’est donc pas forcément correcte. Dans une application financière, un système de réservation ou un service réseau, un résultat silencieusement faux est souvent plus difficile à détecter qu’une exception immédiate.

Choisir un type plus grand sans créer un nouveau problème

Passer de int à long ou à un entier sur 64 bits résout beaucoup de situations, mais pas toutes. Si le calcul est effectué avant la conversion, le débordement peut déjà avoir eu lieu.

int a = 2_000_000_000;
int b = 2_000_000_000;

long mauvais = a + b;
long correct = (long) a + b;

Dans le premier cas, l’addition se fait en int, puis le résultat est converti. Dans le second, la conversion intervient avant l’opération. Cette différence est discrète, mais elle explique une grande partie des erreurs rencontrées dans les calculs de volume, de durée et de taille de fichier.

Je contrôle aussi les frontières entre composants. Une base de données peut utiliser un entier sur 64 bits alors qu’une API, une bibliothèque ou une interface JavaScript attend un entier plus petit. Il faut vérifier le type à chaque étape, notamment lors de la sérialisation JSON, de la lecture d’un fichier et de la transmission sur le réseau.

  • Choisir la largeur du type à partir de la valeur maximale réellement attendue.
  • Vérifier les données avant une conversion vers un type plus petit.
  • Utiliser une addition ou une multiplication protégée pour les données non fiables.
  • Tester les valeurs minimales et maximales, pas seulement les cas habituels.
  • Éviter les conversions implicites entre signés et non signés.

Les cas pratiques où cette limite compte vraiment

Compteurs, stocks et pagination

Un compteur de vues ou un stock local ne dépassera peut-être jamais quelques millions. En revanche, un compteur global, un offset de fichier ou une pagination calculée à partir d’un volume de données peut franchir rapidement la limite de 32 bits. Le bon choix dépend de la croissance prévue, pas uniquement de la valeur observée aujourd’hui.

Pour une pagination, je vérifie particulièrement les multiplications du type page × taille. Même si chaque variable tient dans un entier classique, leur produit peut dépasser la capacité autorisée. Une validation avant le calcul évite un index négatif ou une requête mal formée.

Temps et identifiants

Les anciennes représentations du temps sur 32 bits illustrent bien le problème. Une durée exprimée en secondes, millisecondes ou microsecondes n’atteint pas la même limite, et le choix de l’unité peut réduire fortement la période couverte.

Les identifiants générés par une base ou un service distribué méritent la même attention. Je recommande de prévoir une marge confortable et de documenter l’unité, le signe et la largeur du champ, plutôt que de laisser ces informations dépendre d’une convention implicite.

Lire aussi : Suite de Fibonacci - Coder efficacement et éviter les pièges

Calculs financiers et données sensibles

Un entier plus grand ne garantit pas un calcul financier exact. Pour les montants, le problème concerne aussi les décimales, les arrondis et l’unité choisie. Stocker des centimes dans un entier peut être pertinent, mais il faut alors vérifier que le montant maximal reste compatible avec la borne du type.

Dans les modules liés à la sécurité, je préfère provoquer une erreur contrôlée lorsqu’une valeur dépasse la plage autorisée. Continuer avec une valeur tronquée ou revenue à zéro peut transformer un simple défaut numérique en faille exploitable.

Le bon réflexe avant de valider un entier

Pour moi, la question utile n’est pas seulement « quelle est la valeur maximale ? », mais plutôt « que doit faire le programme lorsqu’il s’en approche ? ». Une limite bien documentée, une conversion contrôlée et quelques tests aux frontières évitent la plupart des surprises.

Avant de choisir un type, je liste la valeur minimale, la valeur maximale, l’unité utilisée et la vitesse de croissance prévue. Si le calcul traverse plusieurs langages ou services, je retiens la contrainte du maillon le plus limité. Cette méthode est souvent plus fiable que de choisir automatiquement le type le plus petit ou le plus grand.

Retenez surtout ceci. 2 147 483 647 est la borne courante d’un entier signé sur 32 bits, mais ce n’est pas une règle universelle. La représentation exacte dépend du langage, du type et du contexte d’exécution, et un programme robuste traite explicitement le dépassement au lieu de l’espérer impossible.

Questions fréquentes

Elle est généralement de 2 147 483 647. Un entier non signé sur 32 bits peut atteindre 4 294 967 295, tandis qu’un entier signé sur 64 bits monte jusqu’à 9 223 372 036 854 775 807.
En C, utilisez INT_MAX depuis , et en C++ std::numeric_limits::max(). Java fournit Integer.MAX_VALUE, tandis que C# propose int.MaxValue ou Int32.MaxValue.
Le résultat dépend du langage. Java effectue généralement un retour cyclique vers une valeur négative, C# peut lever une exception en contexte checked, et le dépassement d’un entier signé en C ou C++ peut produire un comportement indéfini. Les entiers non signés effectuent généralement un calcul modulo 2n.
Si deux variables int sont additionnées avant leur conversion en long, le dépassement peut déjà avoir eu lieu. Il faut donc convertir au moins un opérande avant l’opération, par exemple avec (long) a + b.
Python augmente automatiquement la taille de ses entiers selon la mémoire disponible. JavaScript utilise généralement Number, dont les entiers restent exacts jusqu’à 9 007 199 254 740 991, puis propose BigInt pour les valeurs plus grandes.
Évaluer l'article

Moyenne: 0.0 / 5 · 0 évaluations

Tags

entiers débordement bigint types numériques
Autor Noël Besnard
Noël Besnard
Je m'appelle Noël Besnard et je possède 7 ans d'expérience dans le domaine de la technologie, en particulier en ce qui concerne le web, l'intelligence artificielle, les réseaux et la sécurité. Mon intérêt pour ces sujets a commencé dès mon adolescence, lorsque j'ai découvert le potentiel incroyable des nouvelles technologies pour transformer notre quotidien. J'aime explorer les défis que posent ces avancées et partager des solutions accessibles pour aider les lecteurs à mieux comprendre ces enjeux. Au fil des ans, j'ai eu l'occasion d'écrire sur divers aspects de la tech, en mettant l'accent sur la clarté et la précision. Je m'efforce de vérifier mes sources et de comparer les informations afin de proposer un contenu à jour et fiable. Mon objectif est de rendre des sujets complexes plus simples et compréhensibles, tout en suivant les dernières tendances du secteur. Je suis ravi de partager mes connaissances et d'accompagner les lecteurs dans leur exploration des technologies qui façonnent notre avenir.
Commentaires (0)
Ajouter un commentaire