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#.

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
uncheckedet lever une exception en contextechecked. - 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.