2009-05-06 17 views
7

estoy asistiendo a un comportamiento extraño en un programa .NET:¿Por qué mi .net Int64 se comporta como si fueran de Int32?

Console.WriteLine(Int64.MaxValue.ToString()); 
// displays 9223372036854775807, which is 2^63-1, as expected 

Int64 a = 256*256*256*127; // ok 

Int64 a = 256*256*256*128; // compile time error : 
//"The operation overflows at compile time in checked mode" 
// If i do this at runtime, I get some negative values, so the overflow indeed happens. 

¿Por qué se comporta de mi Int64 como si fueran de Int32, aunque Int64.MaxValue parece confirmar que están utilizando 64 bits?

Si es relevante, estoy usando un sistema operativo de 32 bits, y la plataforma de destino se establece en "Cualquier CPU"

Respuesta

20

Su lado derecho está utilizando solamente Int32 valores, por lo que toda la operación se realiza utilizando Int32 aritmética, luego, se promociona el resultado Int32 a largo.

Cambio a esto:

Int64 a = 256*256*256*128L; 

y todo estará bien.

+1

Dang que Jon Skeet! ¡Me has vencido por unos 10 segundos! :) –

+0

Me siento estúpido :) ¡Gracias! – Brann

+0

No eres estúpido, es un poco intuitivo al principio. Me mordieron para entonces cuando esperaba que "double res = someInt/otherInt" hiciera una división de coma flotante (que no es así) y aprendí que el lado izquierdo no importa. –

4

Uso:

Int64 a = 256L*256L*256L*128L; 

el sufijo L significa Int64 literal, sin sufijo significa Int32.

Lo que su escribió:

Int64 a = 256*256*256*128 

significa:

Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128; 
+0

se recomienda el sufijo de mayúscula 'L' porque se reconoce más fácilmente, y en algunas fuentes no se puede diferenciar ni siquiera' 1' ni 'l' –

Cuestiones relacionadas