El ejercicio muestra el comportamiento de varios tipos numéricos cuando se desbordan, es decir, cuando su capacidad es insuficiente para contener el valor resultante de un cálculo como una operación aritmética o una conversión.
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 comportan de manera similar, excepto 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 en funciones llamadas no se capturan.float y double adoptan un estado de infinito que se puede comprobar con float.IsInfinity(), etc.double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
decimal provocan que se lance una instancia de OverflowException.unchecked correspondiente para las circunstancias en las que quieres invertir el efecto de unchecked dentro de un bloque checked o cuando se ha usado la configuración del compilador.Los desbordamientos que ocurren sin que se lance una excepción pueden ser problemáticos, porque, por lo general, cuanto antes se pueda reportar una condición de error, mejor.
Los problemas con los desbordamientos de 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, en particular en el caso de los valores sin signo. Un caso clásico es el de los códigos hash que usan el ancho del entero como una especie de módulo.
Por lo general, 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 de los que vale. Esto también aplica cuando es evidente por el dominio que no habrá valores muy grandes involucrados. Pero mira esto para conocer una historia con moraleja.