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 es insuficiente para contener el valor resultante de un cálculo como una operación aritmética o una conversión.

  • 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 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
  • 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 en funciones llamadas no se capturan.
  • los tipos 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
  • Los números de tipo decimal provocan que se lance una instancia de OverflowException.
  • Existe una palabra clave 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.

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

Aprende Desbordamiento