L'esercizio mostra il comportamento di vari tipi numerici quando vanno in overflow, cioè quando la loro capacità è insufficiente a contenere il valore risultante da un calcolo come un'operazione aritmetica o un cast.
byte, ushort, uint, ulong) tornano a zero (il valore massimo del tipo + 1 funge da modulo), a meno che, in linea di massima, non compaiano all'interno di un blocco checked, nel qual caso viene generata un'istanza di OverflowException. int e long si comportano in modo simile, tranne per il fatto che tornano a int.MinValue e long.minValue rispettivamente.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 si applica solo alle espressioni direttamente nel blocco. Gli stati di overflow nelle funzioni chiamate non vengono intercettati.float e double assumono uno stato di infinito che può essere verificato con float.IsInfinity() ecc.double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
decimal causano la generazione di un'istanza di OverflowException.unchecked corrispondente, per le circostanze in cui si vuole invertire l'effetto di unchecked all'interno di un blocco checked o quando è stata usata l'impostazione del compilatore.Gli overflow che si verificano senza che venga generata un'eccezione possono essere problematici, perché in generale è vero che prima si riesce a segnalare una condizione di errore, meglio è.
I problemi di overflow per int e float possono essere mitigati assegnando il risultato a una variabile di tipo long, decimal o double.
Se gli interi di grandi dimensioni sono essenziali nel codice, usare il tipo BigInteger è un'opzione.
Naturalmente ci sono occasioni in cui è legittimo lasciare che un intero ecceda tornando al valore iniziale, in particolare nel caso dei valori senza segno. Un caso classico è quello dei codici hash che usano l'ampiezza dell'intero come una sorta di modulo.
Di solito si scopre che nelle basi di codice spesso non c'è alcun controllo dove si usa un uint o un ulong come identificatore, perché si ritiene che non ne valga la pena. Questo vale anche quando è evidente dal dominio che non saranno coinvolti valori molto grandi. Ma guarda questo come monito.