Keine Überlauf-Ausnahme für int in C #?
Hatte ich dieses seltsame Erlebnis mit problem Nummer 10 auf Project Euler (tolle Seite übrigens). Die Aufgabe war es, zu berechnen, die Summe aller Primzahlen unter zwei Millionen.
Ich habe eine int für die Summe, und meine algorith erzeugt eine Antwort, aber wenn ich es eingefügt, um zu überprüfen, die Antwort, es war falsch.
Es stellte sich heraus, dass das Ergebnis zu groß, um zu passen in eine int, aber würde dies nicht zu einem überlauf führen error oder sowas? Stattdessen gibt es nur einen Wert zurückgegeben weit Weg von der realen Antwort.
Wenn ich den Typ geändert zu lang, war alles hunky dory.
Kommentar zu dem Problem - Öffnen
Wollen Sie wirklich jeden integer-operation zu überprüfen überlauf?
Gut, es shure würde gespeichert haben mich einige Zeit in diesem speziellen Fall 😉
In diesem Fall, ja. Die überwiegende Mehrheit der Betriebe ist nicht möglich überlauf, wenn. Es wäre interessant, wenn der compiler könnte das beweisen, und deaktivieren Sie die überprüfung aus, als ein Ergebnis, aber ich bezweifle sehr, das tut es.
InformationsquelleAutor der Frage erikric | 2010-01-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
C# integer-Operationen werfen Sie keine Ausnahmen bei überlauf standardmäßig. Sie können erreichen, dass über die Projekt-Einstellungen, oder durch die Berechnung
checked
:Nun den Vorgang werfen.
Ist das Gegenteil der
unchecked
, weshalb jede operation explizit deaktiviert. Natürlich macht dies nur Sinn, wenn Sie habe geprüft Operationen aktiviert in den Projekteinstellungen.InformationsquelleAutor der Antwort Konrad Rudolph
In C# eine
OverflowException
nicht ausgelöst wird (in VB die exception geworfen wird pro Standard).Um die Exception, die Sie einbetten den code in eine
checked
Kontext:MSDN ausführlich erklärt:
InformationsquelleAutor der Antwort Dirk Vollmar
Es ist, weil, standardmäßig C# werfen Sie keine Ausnahme für integer-überlauf als auch Unterlauf. Es gibt einige Dinge, die Sie hier tun können.
Müssen Sie aktivieren die Ausnahme ausgelöst werden durch zu gehen
Projekt => Eigenschaften => Registerkarte "Erstellen" = > Erweitert => check für arithmetischen überlauf Unterlauf.(stellen Sie sicher, markieren Sie die option)
Stellen Sie sicher, markieren Sie die option
Verwendung eines checked-Blocks und löst einen overflow-exception mit der situation umzugehen. Ein Beispiel-code-snippet wäre
Hoffe das hilft Euch... 🙂
InformationsquelleAutor der Antwort oshan2csd
hab ich schon Hinzugefügt, cmt, aber es ist vielleicht interessant für einige von Euch:
msdn sagt uns:
aber
auch
InformationsquelleAutor der Antwort Andreas Niedermair
Standardmäßig unter C# nicht überprüfen Sie für arithmetischen überlauf auf Ganzzahlen. Sie können dies ändern, mit der
/checked
die compiler-option oder durch das aktivieren der "Check für arithmetischen überlauf/Unterlauf" in Visual Studio (Projekt-Eigenschaften - Aufbau - Fortgeschrittene).Können Sie
geprüft
unddeaktiviert
keywords um die Standardeinstellung zu überschreiben, die auf einer Fall-zu-Fall-basis. Wenn du dich auf die Prüfung stattfindet, in ein Stück code, explizit zu aktivieren es mitchecked
wäre eine gute Idee.Beachten, dass floating-point-Operationen werfen Sie einen
OverflowException
- und decimal-Operationen werfen immer einOverflowException
. Siehe auch C# - Operatoren.InformationsquelleAutor der Antwort Thorarin