Tracks
/
C#
C#
/
Lehrplan
/
Überlauf
Üb

Überlauf in C#

1 Übung

Über Überlauf

Die Übung zeigt das Verhalten verschiedener numerischer Typen bei einem Überlauf, also wenn ihre Kapazität nicht ausreicht, um den Wert aufzunehmen, der aus einer Berechnung wie einer arithmetischen Operation oder einem Cast entsteht.

  • vorzeichenlose Ganzzahlen (byte, ushort, uint, ulong) laufen auf null über (der Maximalwert des Typs + 1 wirkt als Modulus), es sei denn, sie treten, grob gesagt, innerhalb eines checked-Blocks auf. In diesem Fall wird eine Instanz von OverflowException ausgelöst. int und long verhalten sich ähnlich, außer dass sie auf int.MinValue bzw. long.minValue überlaufen.
int one = 1;
checked
{
    int expr = int.MaxValue + one;  // overflow exception is thrown
}

// or

int expr2 = checked(int.MaxValue + one);  // overflow exception is thrown
  • Wenn ein Literal-Ausdruck dazu führen würde, dass die Variable, der er zugewiesen wird, überläuft, dann tritt ein Fehler zur Kompilierzeit auf.
  • der checked-Zustand gilt nur für Ausdrücke, die direkt im Block stehen. Überläufe in aufgerufenen Funktionen werden nicht abgefangen.
  • Typen wie float und double nehmen einen Zustand von Unendlichkeit an, der mit float.IsInfinity() usw. getestet werden kann.
double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
  • Zahlen vom Typ decimal führen dazu, dass eine Instanz von OverflowException ausgelöst wird.
  • Es gibt das entsprechende Schlüsselwort unchecked für Fälle, in denen du die Wirkung von unchecked innerhalb eines checked-Blocks aufheben möchtest oder in denen die Compiler-Einstellung verwendet wurde.

Überläufe, die auftreten, ohne dass eine Ausnahme ausgelöst wird, können problematisch sein, denn generell gilt: Je früher ein Fehlerzustand gemeldet werden kann, desto besser.

Probleme mit Überläufen bei int und float lassen sich entschärfen, indem du das Ergebnis einer Variablen vom Typ long, decimal oder double zuweist.

Wenn große Ganzzahlen für deinen Code unerlässlich sind, ist die Verwendung des Typs BigInteger eine Option.

Natürlich gibt es Gelegenheiten, bei denen es legitim ist, eine Ganzzahl umlaufen zu lassen, besonders bei vorzeichenlosen Werten. Ein klassischer Fall sind Hashcodes, die die Breite der Ganzzahl als eine Art Modulo verwenden.

In Codebasen wirst du üblicherweise feststellen, dass oft keine Prüfung erfolgt, wo ein uint oder ein ulong als Bezeichner verwendet wird, weil es als mehr Mühe als wert angesehen wird. Das gilt auch, wenn aus der Domäne ersichtlich ist, dass keine sehr großen Werte vorkommen werden. Aber schau dir dies als abschreckendes Beispiel an.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Überlauf