O exercício mostra o comportamento de vários tipos numéricos quando ocorre overflow, ou seja, quando a sua capacidade é insuficiente para conter o valor resultante de um cálculo como uma operação aritmética ou uma conversão.
byte, ushort, uint, ulong) dão a volta até zero (o valor máximo do tipo + 1 funciona como módulo), a menos que, em termos gerais, apareçam dentro de um bloco checked, caso em que é lançada uma instância de OverflowException. O int e o long comportam-se de forma semelhante, exceto que dão a volta até int.MinValue e long.minValue, respetivamente.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 aplica-se apenas às expressões diretamente no bloco. Os estados de overflow em funções chamadas não são detetados.float e double assumem um estado de infinito que pode ser testado com float.IsInfinity(), etc.double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
decimal fazem com que seja lançada uma instância de OverflowException.unchecked correspondente para as situações em que queres inverter o efeito de unchecked dentro de um bloco checked ou quando a opção do compilador tiver sido usada.Os overflows que ocorrem sem que seja lançada uma exceção podem ser problemáticos, porque, em geral, quanto mais cedo se conseguir reportar uma condição de erro, melhor.
Os problemas com overflows de int e float podem ser atenuados atribuindo o resultado a uma variável do tipo long, decimal ou double.
Se os inteiros grandes forem essenciais para o teu código, usar o tipo BigInteger é uma opção.
Naturalmente, há ocasiões em que é legítimo permitir que um inteiro dê a volta, sobretudo no caso de valores sem sinal. Um caso clássico é o dos códigos de hash, que usam a largura do inteiro como uma espécie de módulo.
Normalmente vais encontrar, nas bases de código, que muitas vezes não há verificação quando um uint ou um ulong é usado como identificador, porque se considera que dá mais trabalho do que vale a pena. Isto também se aplica quando é evidente, pelo domínio, que não estarão envolvidos valores muito grandes. Mas olha para isto para um conto com moral.