Heim >Backend-Entwicklung >C++ >Ist ein vorzeichenbehafteter Ganzzahlüberlauf in C immer noch ein undefiniertes Verhalten?
Ist ein vorzeichenbehafteter Ganzzahlüberlauf in C immer noch ein undefiniertes Verhalten?
Wie im C 11-Standard definiert, bleibt ein vorzeichenbehafteter Ganzzahlüberlauf ein undefiniertes Verhalten. Obwohl in der cstdint-Dokumentation angegeben ist, dass die Typen int8_t, int16_t, int32_t und int64_t das Zweierkomplement für negative Werte verwenden, gilt das Überlaufverhalten immer noch als undefiniert.
Der C 11-Standard in Absatz 5/4 besagt nachdrücklich:
**Wenn bei der Auswertung eines Ausdrucks das Ergebnis mathematisch nicht definiert ist oder nicht im Obwohl eine Zweierkomplementdarstellung für diese vorzeichenbehafteten Typen verwendet wird, wird daher bei der Auswertung nicht implizit von der Modulo-2^n-Arithmetik ausgegangen .Umgekehrt legt der C 11-Standard in Absatz 3.9.1/4 ausdrücklich fest, dass vorzeichenlose Arithmetik erforderlich ist folgt der modularen Arithmetik:
Ganzzahlen ohne Vorzeichen, die als vorzeichenlos deklariert werden, müssen den Gesetzen der Arithmetik Modulo 2^n gehorchen
wobei n die Anzahlder Bits in der Wertdarstellung dieser bestimmten Zahl ist Größe der GanzzahlFolglich sind vorzeichenlose Rechenoperationen immer mathematisch definierbar und der resultierende Wert liegt innerhalb des darstellbaren Bereichs, wodurch er von der undefinierten Verhaltensklausel ausgenommen wird. Fußnote 46 verdeutlicht dies weiter:Dies impliziert, dass die
vorzeichenlose
-Arithmetik nicht überläuft, da ein Ergebnis, das nicht durch den resultierendenvorzeichenlosen Ganzzahltyp dargestellt werden kann, modulo um die Zahl reduziert wird, die eins ist größer als der größte Wert, der durch denresultierenden vorzeichenlosen Ganzzahltyp dargestellt werden kann.
In Zusammenfassung: Während die Verwendung der Zweierkomplementdarstellung für vorzeichenbehaftete Typen ein genau definiertes Verhalten für negative Werte bietet, bleibt der Ganzzahlüberlauf für diese Typen in C ein undefiniertes Verhalten, da der Standard jedes Implementierungsabhängige Verhalten überschreibt.
Das obige ist der detaillierte Inhalt vonIst ein vorzeichenbehafteter Ganzzahlüberlauf in C immer noch ein undefiniertes Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!