El ejercicio muestra el comportamiento de varios tipos numéricos cuando se desbordan, es decir, cuando su capacidad no basta para contener el valor resultante de un cálculo como una operación aritmética o una conversión de tipo.
byte, ushort, uint, ulong) dan la vuelta hasta cero (el valor máximo del tipo + 1 actúa como módulo), a menos que, en términos generales, aparezcan dentro de un bloque checked, en cuyo caso se lanza una instancia de OverflowException. int y long se comportarán de forma similar, salvo que dan la vuelta hasta int.MinValue y long.minValue respectivamente.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 se aplica solo a las expresiones que están directamente en el bloque. Los estados de desbordamiento de las funciones a las que se llama no se capturan.float y double adoptarán un estado de infinito que se puede comprobar con float.IsInfinity(), etc.double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
decimal provocarán que se lance una instancia de OverflowException.unchecked correspondiente para los casos en los que quieras invertir el efecto de unchecked dentro de un bloque checked o cuando se ha usado la configuración del compilador.Los desbordamientos que se producen sin que se lance una excepción pueden ser problemáticos, porque por lo general cuanto antes se pueda notificar una condición de error, mejor.
Los problemas de desbordamiento con int y float se pueden mitigar asignando el resultado a una variable de tipo long, decimal o double.
Si los enteros grandes son esenciales para tu código, usar el tipo BigInteger es una opción.
Naturalmente, hay ocasiones en las que es legítimo permitir que un entero dé la vuelta, sobre todo en el caso de los valores sin signo. Un caso clásico es el de los códigos hash que usan la anchura del entero como una especie de módulo.
Normalmente encontrarás que en las bases de código a menudo no hay ninguna comprobación cuando se usa un uint o un ulong como identificador, porque se considera que da más problemas que beneficios. Esto también se aplica cuando es evidente por el dominio que no habrá valores muy grandes. Pero mira esto para conocer una historia aleccionadora.