Numerische Grenzen und Überlaufverhalten
Fragen Sie std::numeric_limits ab und verstehen Sie die Überlaufregeln für vorzeichenbehaftete und vorzeichenlose Typen.
Numerische Grenzen und Überlaufverhalten ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Grenzwerte wichtig sind
Jeder numerische Typ hat einen maximalen und einen minimalen darstellbaren Wert. Werden diese überschritten, kann das unbemerkt zu falschen Ergebnissen oder zu undefiniertem Verhalten führen.
std::numeric_limits
Fragen Sie die Grenzwerte jedes numerischen Typs mit dem Header <limits> ab. Es handelt sich um Compilezeitkonstanten — ohne Laufzeitkosten.
#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();Häufige Abfragen
Die wichtigsten Member:
max()— größter Wertmin()— kleinster (positiver) Wertlowest()— negativster Wertepsilon()— kleinster sinnvoller Unterschied (Gleitkommazahlen)digits10— garantierte Dezimalstellen
Überlauf vorzeichenbehafteter Ganzzahlen
Ein Überlauf vorzeichenbehafteter Ganzzahlen ist undefiniertes Verhalten. Der Compiler darf annehmen, dass er nie auftritt, was zu überraschenden Optimierungen führen kann.
int x = std::numeric_limits<int>::max();
x += 1; // UB — anything can happenÜberlauf vorzeichenloser Ganzzahlen
Ein Überlauf vorzeichenloser Ganzzahlen ist definiert — die Werte laufen modulo 2^N über. Das ist manchmal nützlich, führt aber häufig zu schwer erkennbaren Fehlern.
unsigned int u = 0;
u -= 1; // wraps to 4,294,967,295 (UINT_MAX)Über- und Unterlauf bei Gleitkommazahlen
Gleitkommazahlen laufen bei einem Überlauf in inf über, anstatt einen Absturz zu verursachen. Ein Unterlauf führt zu subnormalen Zahlen oder zu 0.
double x = 1e308;
x *= 100;
std::cout << x; // infÜberlauf sicher erkennen
Prüfen Sie bei vorzeichenbehafteten Ganzzahlen den Wert vor der Operation. Compiler stellen integrierte Hilfsfunktionen für geprüfte Arithmetik bereit, etwa __builtin_add_overflow bei GCC/Clang.
if (a > std::numeric_limits<int>::max() - b) {
// overflow would happen
}
int sum = a + b;C++20 std::ssize und std::cmp_less
C++20 fügt in <utility> sichere Hilfsfunktionen für Ganzzahlvergleiche hinzu: std::cmp_equal, cmp_less, cmp_greater. Sie behandeln die Mischung aus vorzeichenbehafteten und vorzeichenlosen Typen korrekt.
Implizite Konvertierungen sind tückisch
Beim Mischen vorzeichenbehafteter und vorzeichenloser Werte in einem Vergleich wird der vorzeichenbehaftete Operand unbemerkt in einen vorzeichenlosen Typ konvertiert — eine häufige Quelle subtiler Fehler.
int a = -1;
unsigned int b = 1;
if (a < b) std::cout << "yes";
else std::cout << "no"; // prints "no"!Prüfungen zur Compilezeit
Verwenden Sie static_assert, um beim Schreiben portablen Codes Annahmen über Größen durchzusetzen.
static_assert(sizeof(int) >= 4, "Need at least 32-bit int");Sanitizer helfen beim Testen
Erstellen Sie das Programm mit -fsanitize=undefined, um während der Tests Überläufe vorzeichenbehafteter Ganzzahlen zur Laufzeit zu erkennen.
g++ -fsanitize=undefined -O1 main.cppKurzer Test
Was geschieht, wenn eine Addition vorzeichenbehafteter Ganzzahlen in C++ überläuft?
Zusammenfassung
Verwenden Sie std::numeric_limits, um die Grenzen eines Typs abzufragen. Überläufe vorzeichenbehafteter Ganzzahlen sind undefiniert; vorzeichenlose Ganzzahlen laufen über. Das Mischen vorzeichenbehafteter und vorzeichenloser Typen erfolgt auf eigene Gefahr. Sanitizer und sichere Vergleiche aus C++20 helfen, Ihren Code abzusichern.
Lerne C++ mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „Numerische Grenzen und Überlaufverhalten“ kostenlos?
Ja — der vollständige Text von „Numerische Grenzen und Überlaufverhalten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Numerische Grenzen und Überlaufverhalten“?
Fragen Sie std::numeric_limits ab und verstehen Sie die Überlaufregeln für vorzeichenbehaftete und vorzeichenlose Typen. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C++ Academy zu starten?
Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Numerische Grenzen und Überlaufverhalten“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?
Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Ganzzahl- und Gleitkommatypen
- Der Header cmath: pow, sqrt, abs, round
- Zufallszahlen mit dem Header random
- Numerische Grenzen und Überlaufverhalten