Ich scheine mich zu erinnern, dass ich das gelesen habe
underflow
bedeutet, dass Sie eine zu kleine Größe haben , die in einem Typ nicht mehr dargestellt werden kannoverflow
bedeutet, dass Sie eine zu große Größe haben , die in einem Typ nicht mehr dargestellt werden kann
In der Praxis nehme ich jedoch wahr, dass die Begriffe so verwendet werden, dass
underflow
bedeutet, dass Sie einen zu kleinen Wert haben , der in einem Typ nicht mehr dargestellt werden kannoverflow
bedeutet, dass Sie einen zu großen Wert haben , der in einem Typ nicht mehr dargestellt werden kann
Was ist die richtige Bedeutung, um hier zu verwenden? Sind die Begriffe für Ganzzahl- und Gleitkommatypen unterschiedlich definiert?
terminology
Johannes Schaub - litb
quelle
quelle
INT_MIN - 1
oderINT_MAX + 1
Antworten:
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:
In der Fußnote heißt es weiter:
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
undINT_MAX + 1
. In beiden Fällen ist imint
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.
quelle
Es ist ein Überlauf. Bei ganzzahligen Werten tritt kein Unterlauf auf.
Ein Überlauf liegt vor, wenn ein Wert zu groß ist (zu weit von Null entfernt), um durch den bestimmten Typ dargestellt zu werden, und ein Unterlauf liegt vor, wenn er zu klein ist (zu nahe bei Null).
Da die Ganzzahlwerte, die Null am nächsten liegen (1 und -1), weiterhin durch eine Ganzzahlvariable dargestellt werden können (unter der Annahme einer vorzeichenbehafteten Ganzzahl mit mehr als einem Bit), kann kein Unterlauf auftreten.
Der Wikipedia-Artikel über Unterlauf hat eine ziemlich klare Beschreibung:
quelle
underflow
häufig speziell verwendet wird, um sich auf die bestimmte Bedingung zu beziehen, bei der die Größe einer Zahl kleiner als die des kleinstmöglichen Werts ungleich Null ist, aber größer als der kleinstmögliche Abstand zwischen Werten ungleich Null - in anderen Fällen Wörter, Fälle, in denen Zahlen in das fallen, was der Wiki-Artikel als "Unterlauflücke" bezeichnet. Bei IEEE-744-kompatiblen Implementierungen entspricht die kleinste darstellbare Zahl der kleinsten darstellbaren Differenz zwischen Zahlen, sodass solche Unterläufe nicht auftreten können. Außerhalb der PC-Welt sind jedoch nicht alle Systeme IEEE-konform.In der Ganzzahlmathematik bezieht sich Überlauf sowohl auf zu große als auch auf zu kleine Werte. Im Gleitkomma bezieht sich Überlauf auf einen zu großen Exponenten und Unterlauf auf einen zu kleinen Exponenten.
Tatsächlich können CPUs bei ganzzahligen Typen den Unterschied zwischen Überlauf und Unterlauf nicht erkennen. Nehmen Sie das folgende 16-Bit-Add:
Das Überlauf-Flag in der CPU würde natürlich nach diesem Hinzufügen gesetzt. Bei Verwendung von vorzeichenbehafteter Mathematik ist das Ergebnis zu klein (-32768). Bei Verwendung von vorzeichenloser Mathematik ist das Ergebnis zu groß (0x17FFF). Da die Komplementmathematik von 2 für vorzeichenbehaftete und vorzeichenlose Typen identisch
overflow
ist, muss sie sowohl zu große als auch zu kleine Werte bedeuten.quelle