Limites numériques et comportement en cas de dépassement
Interroger std::numeric_limits et comprendre les règles de dépassement des entiers signés et non signés
Limites numériques et comportement en cas de dépassement est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Pourquoi les limites sont importantes
Chaque type numérique possède une valeur maximale et une valeur minimale représentables. Les dépasser peut produire silencieusement des résultats incorrects — ou un comportement indéfini.
std::numeric_limits
Interrogez les limites de n’importe quel type numérique avec l’en-tête <limits>. Ce sont des constantes évaluées à la compilation — sans coût à l’exécution.
#include <limits>
std::cout << std::numeric_limits<int>::max() << "\n";
std::cout << std::numeric_limits<int>::min() << "\n";
std::cout << std::numeric_limits<double>::epsilon();Requêtes courantes
Les membres les plus utiles :
max()— valeur maximalemin()— plus petite valeur (positive)lowest()— valeur la plus négativeepsilon()— plus petite différence significative (pour les flottants)digits10— chiffres décimaux garantis
Dépassement des entiers signés
Le dépassement d’un entier signé est un comportement indéfini. Le compilateur peut supposer qu’il ne se produit jamais, ce qui peut entraîner des optimisations surprenantes.
int x = std::numeric_limits<int>::max();
x += 1; // UB — anything can happenBouclage des entiers non signés
Le dépassement d’un entier non signé est défini : les valeurs bouclent modulo 2^N. Cela peut être utile dans certains cas, mais c’est souvent un piège.
unsigned int u = 0;
u -= 1; // wraps to 4,294,967,295 (UINT_MAX)Dépassement et sous-dépassement des flottants
Les flottants dépassent leur capacité vers inf au lieu de provoquer un plantage. Le sous-dépassement produit des nombres subnormaux ou 0.
double x = 1e308;
x *= 100;
std::cout << x; // infDétecter les dépassements en toute sécurité
Pour les entiers signés, vérifiez avant l’opération. Les compilateurs fournissent des fonctions intégrées d’arithmétique vérifiée, comme __builtin_add_overflow avec GCC/Clang.
if (a > std::numeric_limits<int>::max() - b) {
// overflow would happen
}
int sum = a + b;C++20 std::ssize et std::cmp_less
C++20 ajoute des fonctions sûres de comparaison d’entiers dans <utility> : std::cmp_equal, cmp_less, cmp_greater. Elles gèrent correctement le mélange des types signés et non signés.
Les conversions implicites sont sournoises
Mélanger des types signés et non signés dans une comparaison convertit silencieusement l’opérande signé en type non signé — une source courante de bogues subtils.
int a = -1;
unsigned int b = 1;
if (a < b) std::cout << "yes";
else std::cout << "no"; // prints "no"!Vérifications à la compilation
Utilisez static_assert pour imposer des hypothèses sur les tailles lors de l’écriture de code portable.
static_assert(sizeof(int) >= 4, "Need at least 32-bit int");Les désinfecteurs aident lors des tests
Compilez avec -fsanitize=undefined pour détecter les dépassements d’entiers signés à l’exécution pendant les tests.
g++ -fsanitize=undefined -O1 main.cppVérification rapide
Que se passe-t-il lorsqu’une addition d’entiers signés dépasse la capacité en C++ ?
Récapitulatif
Utilisez std::numeric_limits pour interroger les limites des types. Le dépassement des entiers signés est indéfini ; les entiers non signés bouclent. Mélangez les types signés et non signés à vos risques et périls. Les désinfecteurs et les comparaisons sûres de C++20 contribuent à protéger votre code.
Apprends C++ avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 51
- Leçons
- 203
Questions Fréquemment Posées
La leçon « Limites numériques et comportement en cas de dépassement » est-elle gratuite ?
Oui — le texte complet de « Limites numériques et comportement en cas de dépassement » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Limites numériques et comportement en cas de dépassement » ?
Interroger std::numeric_limits et comprendre les règles de dépassement des entiers signés et non signés Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Limites numériques et comportement en cas de dépassement » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Types entiers et à virgule flottante
- L’en-tête cmath : pow, sqrt, abs, round
- Nombres aléatoires avec l’en-tête random
- Limites numériques et comportement en cas de dépassement