Ich kann in dieser Angelegenheit keine wirklich "maßgebliche" Quelle finden, hauptsächlich, weil dies wahrscheinlich eine Frage der Konvention ist und die Terminologie oft sehr inkonsistent ist. Der folgende Auszug aus Robert Seacords " Secure Coding in C und C ++ " fasst mein Verständnis der Situation zusammen:
Ein Ganzzahlüberlauf tritt auf, wenn eine Ganzzahl über ihren Maximalwert hinaus erhöht oder über ihren Minimalwert 3 hinaus verringert wird . Ganzzahlige Überläufe hängen eng mit der zugrunde liegenden Darstellung zusammen.
In der Fußnote heißt es weiter:
[3] eine ganze Zahl über seinen Minimalwert abnimmt oft als Integer bezeichnet Unterschreitung , obwohl technisch dieser Begriff auf einen Zustand Gleitkomma- bezieht.
Der Grund, warum wir es einen ganzzahligen Überlauf nennen, ist, dass im Typ einfach nicht genügend Speicherplatz verfügbar ist, um den Wert darzustellen. In diesem Sinne ähnelt es einem Pufferüberlauf (außer dass es die Puffergrenze tatsächlich überschreitet, zeigt es normalerweise ein Umlaufverhalten. *) Aus dieser Perspektive gibt es keinen konzeptionellen Unterschied zwischen INT_MIN - 1
und INT_MAX + 1
. In beiden Fällen ist im int
Datentyp einfach nicht genügend Speicherplatz vorhanden , um einen der beiden Werte darzustellen. Wir haben also einen Überlauf .
Es kann auch nützlich sein zu beachten, dass in den x86- und x86_64-Prozessorarchitekturen das Flags-Register ein Überlaufbit enthält . Das Überlaufbit wird gesetzt, wenn eine vorzeichenbehaftete ganzzahlige arithmetische Operation überläuft. Der Ausdruck INT_MIN - 1
setzt das Überlaufbit. (Es gibt kein "Unterlauf" -Bit.) Die Ingenieure von AMD und Intel verwenden den Begriff "Überlauf", um das Ergebnis einer ganzzahligen arithmetischen Operation zu beschreiben, die zu viele Bits enthält, um in den Datentyp zu passen, unabhängig davon, ob die Wert ist numerisch zu groß oder zu klein.
* In C ist ein vorzeichenbehafteter Ganzzahlüberlauf tatsächlich ein undefiniertes Verhalten, aber in anderen Sprachen wie Java wird die Komplementarithmetik der beiden umbrochen.
INT_MIN - 1
oderINT_MAX + 1