¿Alguna vez intentó resumir todos los números del 1 al 2,000 en su lenguaje de programación favorito? El resultado es fácil de calcular manualmente: 2,000,001,000,000, unas 900 veces más grande que el valor máximo de un entero sin signo de 32 bits.
C # imprime -1453759936
- ¡un valor negativo! Y supongo que Java hace lo mismo.
Eso significa que hay algunos lenguajes de programación comunes que ignoran el Desbordamiento aritmético de forma predeterminada (en C #, hay opciones ocultas para cambiar eso). Ese es un comportamiento que me parece muy arriesgado, y ¿no fue el choque de Ariane 5 causado por un desbordamiento de este tipo?
Entonces, ¿cuáles son las decisiones de diseño detrás de un comportamiento tan peligroso?
Editar:
Las primeras respuestas a esta pregunta expresan los costos excesivos de la verificación. Vamos a ejecutar un programa corto de C # para probar este supuesto:
Stopwatch watch = Stopwatch.StartNew();
checked
{
for (int i = 0; i < 200000; i++)
{
int sum = 0;
for (int j = 1; j < 50000; j++)
{
sum += j;
}
}
}
watch.Stop();
Console.WriteLine(watch.Elapsed.TotalMilliseconds);
En mi máquina, la versión marcada toma 11015ms, mientras que la versión sin marcar toma 4125ms. Es decir. los pasos de verificación llevan casi el doble de tiempo que los números (en total 3 veces el tiempo original). Pero con las 10,000,000,000 de repeticiones, el tiempo tomado por un chequeo es aún menor a 1 nanosegundo. Puede haber una situación en la que eso sea importante, pero para la mayoría de las aplicaciones, eso no importa.
Edit 2:
Recopilé la aplicación de nuestro servidor (un servicio de Windows que analiza los datos recibidos de varios sensores, que involucra un gran número de cálculos) con el parámetro /p:CheckForOverflowUnderflow="false"
(normalmente, cambio la verificación de desbordamiento) y lo implementé en un dispositivo. El monitoreo de Nagios muestra que la carga promedio de la CPU se mantuvo en un 17%.
Esto significa que el impacto de rendimiento que se encuentra en el ejemplo anterior es totalmente irrelevante para nuestra aplicación.