¿Por qué mis .net Int64 se comportan como si fueran Int32?
-
06-07-2019 - |
Pregunta
Soy testigo de un comportamiento extraño en un programa .net:
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é mis Int64 se comportan como si fueran Int32, aunque Int64.MaxValue parece confirmar que están usando 64 bits?
Si es relevante, estoy usando un sistema operativo de 32 bits, y la plataforma de destino está configurada en "Cualquier CPU"
Solución
Su RHS solo utiliza valores Int32
, por lo que toda la operación se realiza utilizando la aritmética Int32
, luego el resultado Int32
se promociona a largo.
Cámbielo a esto:
Int64 a = 256*256*256*128L;
y todo estará bien.
Otros consejos
Uso:
Int64 a = 256L*256L*256L*128L;
el sufijo L significa Int64 literal, sin sufijo significa Int32.
Lo que escribiste:
Int64 a = 256*256*256*128
significa:
Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow