Η άσκηση δείχνει τη συμπεριφορά διάφορων αριθμητικών τύπων όταν υπερχειλίζουν, δηλαδή όταν η χωρητικότητά τους δεν επαρκεί για να περιέχει την τιμή που προκύπτει από έναν υπολογισμό, όπως μια αριθμητική πράξη ή μια μετατροπή τύπου.
byte, ushort, uint, ulong) θα επιστρέψουν κυκλικά στο μηδέν (η μέγιστη τιμή του τύπου + 1 λειτουργεί ως μέτρο), εκτός αν, γενικά μιλώντας, βρίσκονται μέσα σε ένα μπλοκ checked, οπότε πετιέται ένα στιγμιότυπο της OverflowException. Οι int και long θα συμπεριφερθούν παρόμοια, μόνο που θα επιστρέψουν κυκλικά στο int.MinValue και στο long.minValue αντίστοιχα.int one = 1;
checked
{
int expr = int.MaxValue + one; // overflow exception is thrown
}
// or
int expr2 = checked(int.MaxValue + one); // overflow exception is thrown
checked ισχύει μόνο για εκφράσεις που βρίσκονται απευθείας μέσα στο μπλοκ. Οι καταστάσεις υπερχείλισης σε συναρτήσεις που καλούνται δεν πιάνονται.float και double θα υιοθετήσουν μια κατάσταση άπειρου, η οποία μπορεί να ελεγχθεί με float.IsInfinity() κ.λπ.double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
decimal θα έχουν ως αποτέλεσμα να πεταχτεί ένα στιγμιότυπο της OverflowException.unchecked για περιπτώσεις όπου θέλεις να αντιστρέψεις το αποτέλεσμα του unchecked μέσα σε ένα μπλοκ checked ή όταν έχει χρησιμοποιηθεί η ρύθμιση του μεταγλωττιστή.Οι υπερχειλίσεις που συμβαίνουν χωρίς να πεταχτεί κάποια εξαίρεση μπορούν να αποδειχτούν προβληματικές, γιατί γενικά ισχύει ότι όσο νωρίτερα μπορεί να αναφερθεί μια κατάσταση σφάλματος, τόσο το καλύτερο.
Τα προβλήματα με τις υπερχειλίσεις για τους int και float μπορούν να μετριαστούν αν αναθέσεις το αποτέλεσμα σε μια μεταβλητή τύπου long, decimal ή double.
Αν οι μεγάλοι ακέραιοι είναι απαραίτητοι στον κώδικά σου, τότε η χρήση του τύπου BigInteger είναι μια επιλογή.
Φυσικά υπάρχουν περιπτώσεις στις οποίες είναι θεμιτό να αφήσεις έναν ακέραιο να επιστρέψει κυκλικά, ειδικά στην περίπτωση των τιμών χωρίς πρόσημο. Κλασική περίπτωση είναι οι κωδικοί κατακερματισμού που χρησιμοποιούν το πλάτος του ακέραιου ως ένα είδος μέτρου.
Συνήθως θα διαπιστώσεις ότι σε κώδικες δεν γίνεται συχνά έλεγχος όταν ένα uint ή ένα ulong χρησιμοποιείται ως αναγνωριστικό, γιατί θεωρείται ότι δημιουργεί περισσότερα προβλήματα από όσα αξίζει. Αυτό ισχύει επίσης όταν είναι προφανές από το πεδίο εφαρμογής ότι δεν θα εμπλακούν πολύ μεγάλες τιμές. Όμως, ρίξε μια ματιά σε αυτό για μια προειδοποιητική ιστορία.