C++ Academy · Lektion

Numerische Grenzen und Überlaufverhalten

Fragen Sie std::numeric_limits ab und verstehen Sie die Überlaufregeln für vorzeichenbehaftete und vorzeichenlose Typen.

Lektion 4 von 413 Schritte

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 Wert
  • min() — kleinster (positiver) Wert
  • lowest() — negativster Wert
  • epsilon() — 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.cpp

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

Kostenlos starten

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

  1. Ganzzahl- und Gleitkommatypen
  2. Der Header cmath: pow, sqrt, abs, round
  3. Zufallszahlen mit dem Header random
  4. Numerische Grenzen und Überlaufverhalten
← Zurück zu C++ Academy