Ist INT_MIN-1 ein Unterlauf oder ein Überlauf?

10

Ich scheine mich zu erinnern, dass ich das gelesen habe

  • underflowbedeutet, dass Sie eine zu kleine Größe haben , die in einem Typ nicht mehr dargestellt werden kann
  • overflowbedeutet, 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

  • underflowbedeutet, dass Sie einen zu kleinen Wert haben , der in einem Typ nicht mehr dargestellt werden kann
  • overflowbedeutet, 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?

Johannes Schaub - litb
quelle
2
Im Allgemeinen scheint der Begriff "Unterlauf" der Gleitkomma-Arithmetik vorbehalten zu sein. Mit ganzen Zahlen sage ich normalerweise "Überlauf", unabhängig davon, ob es ist INT_MIN - 1oderINT_MAX + 1
Charles Salvia

Antworten:

15

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 - 1und INT_MAX + 1. In beiden Fällen ist im intDatentyp 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 - 1setzt 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.

Charles Salvia
quelle
6

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:

"Der Begriff arithmetischer Unterlauf (oder" Gleitkomma-Unterlauf "oder einfach" Unterlauf ") ist eine Bedingung in einem Computerprogramm, die auftreten kann, wenn das wahre Ergebnis einer Gleitkommaoperation kleiner ist (dh näher an Null liegt). als der kleinste Wert, der als normale Gleitkommazahl im Zieldatentyp dargestellt werden kann. Unterlauf kann teilweise als negativer Überlauf des Exponenten des Gleitkommawertes angesehen werden. "

Guffa
quelle
Es kann nützlich sein zu beachten, dass dies underflowhä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.
Supercat
2

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:

  0x8000 (unsigned 32768, or signed -32767)
+ 0xFFFF (unsigned 65535, or signed -1)
--------
  0x7FFF (32767, the carried '1' is lost)

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 overflowist, muss sie sowohl zu große als auch zu kleine Werte bedeuten.

Hinweis zum Selbstdenken an einen Namen
quelle