2008-12-22 41 views
7

¿Alguien me puede explicar el motivo del desbordamiento en la variable a? Tenga en cuenta que b es más grande que a.Extraño C# error de desbordamiento

static void Main(string[] args) 
{ 
    int i = 2;  
    long a = 1024 * 1024 * 1024 * i; 
    long b = 123456789; 
    System.Console.WriteLine("{0}", a); 
    System.Console.WriteLine("{0}", b); 
    System.Console.WriteLine("{0}", long.MaxValue); 
} 

-2147483648 
123456789
9223372036854775807 
Press any key to continue . . . 

Gracias!

Respuesta

26

El RHS es una multiplicación int porque cada parte de la expresión es un int. El hecho de que se asigne a una duración larga no significa que se realice con una aritmética larga.

Cambiar a:

long a = 1024L * 1024 * 1024 * i; 

y que va a trabajar. (La diferencia es la L al final del primer 1024.)

+0

¿Tal vez el tiempo de ejecución podría ser más flexible y automáticamente "expandir" el cálculo si ve que la expresión se almacenará en largo? –

+0

@Petar: Creo que sería una mala idea. Haría el lenguaje mucho más complicado. Es fácil evitar este problema, y ​​mantiene el lenguaje simple: hay algunos lugares donde el significado de una expresión depende de su contexto (por ejemplo, expresiones lambda) pero no quiero ver más. –