Tracks
/
C#
C#
/
Temario
/
Desbordamiento
De

Desbordamiento en C#

1 ejercicio

Acerca de Desbordamiento

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.

  • Los enteros sin signo (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
  • Si una expresión literal provocara que se desbordara la variable a la que se asigna, se produce un error en tiempo de compilación.
  • El estado 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.
  • Los tipos 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
  • Los números de tipo decimal provocarán que se lance una instancia de OverflowException.
  • Existe una palabra clave 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.

Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Desbordamiento