Warum verursachen Sprachen standardmäßig keine Fehler beim Überlauf von Ganzzahlen?

In mehreren modernen Programmiersprachen (einschließlich C ++, Java und C #) ermöglicht die SpracheInteger-Überlauf zur Laufzeit auftreten, ohne eine Fehlerbedingung auszulösen.

Betrachten Sie beispielsweise diese (erfundene) C # -Methode, bei der die Möglichkeit eines Überlaufs / Unterlaufs nicht berücksichtigt wird. (Der Kürze halber behandelt die Methode auch nicht den Fall, in dem die angegebene Liste eine Nullreferenz ist.)

<code>//Returns the sum of the values in the specified list.
private static int sumList(List<int> list)
{
    int sum = 0;
    foreach (int listItem in list)
    {
        sum += listItem;
    }
    return sum;
}
</code>

Wenn diese Methode wie folgt aufgerufen wird:

<code>List<int> list = new List<int>();
list.Add(2000000000);
list.Add(2000000000);
int sum = sumList(list);
</code>

Im wird ein Überlauf auftretensumList() Methode (weil dieint Typ in C # ist eine 32-Bit-Ganzzahl mit Vorzeichen, und die Summe der Werte in der Liste überschreitet den Wert der maximalen 32-Bit-Ganzzahl mit Vorzeichen. Die Summenvariable hat einen Wert von -294967296 (kein Wert von 4000000000); Dies ist höchstwahrscheinlich nicht das, was der (hypothetische) Entwickler der sumList-Methode beabsichtigt hat.

Offensichtlich gibt es verschiedene Techniken, die von Entwicklern verwendet werden können, um die Möglichkeit eines Ganzzahlüberlaufs zu vermeiden, z. B. die Verwendung eines Typs wie Java'sBigInteger, oder derchecked Schlüsselwort und/checked Compiler-Schalter in C #.

Die Frage, die mich interessiert, ist jedoch, warum diese Sprachen standardmäßig so konzipiert wurden, dass es zu Ganzzahlüberläufen kommt, anstatt zum Beispiel eine Ausnahme auszulösen, wenn zur Laufzeit eine Operation ausgeführt wird, die zu einer führt Überlauf. Es scheint, als würde ein solches Verhalten dazu beitragen, Fehler zu vermeiden, wenn ein Entwickler die Möglichkeit eines Überlaufs beim Schreiben von Code, der eine arithmetische Operation ausführt, die zu einem Überlauf führen kann, vernachlässigt. (Diese Sprachen könnten so etwas wie ein "ungeprüftes" Schlüsselwort enthalten haben, das einen Block bezeichnen könnte, in dem ein Ganzzahlüberlauf ohne Ausnahme auftreten darf, in den Fällen, in denen dieses Verhalten ausdrücklich vom Entwickler beabsichtigt ist; C # tatsächlichhat das.)

Kommt die Antwort einfach auf die Leistung hinaus - die Sprachentwickler wollten nicht, dass ihre jeweiligen Sprachen standardmäßig "langsame" arithmetische Ganzzahloperationen ausführen, bei denen die Laufzeit zusätzliche Arbeit leisten müsste, um zu überprüfen, ob bei jeder anwendbaren Arithmetik ein Überlauf aufgetreten ist Betrieb - und diese Leistungsüberlegung überwog den Wert der Vermeidung von "stillen" Fehlern im Fall eines versehentlichen Überlaufs?

Gibt es andere Gründe für diese Entscheidung für das Sprachdesign als Leistungsüberlegungen?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage