Perché i miei .net Int64 si comportano come se fossero Int32?
-
06-07-2019 - |
Domanda
Sto assistendo a uno strano comportamento in un programma .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.
Perché il mio Int64 si comporta come se fosse Int32, anche se Int64.MaxValue sembra confermare che stanno usando 64 bit?
Se è pertinente, sto usando un sistema operativo a 32 bit e la piattaforma di destinazione è impostata su " Qualsiasi CPU "
Soluzione
Il tuo RHS utilizza solo i valori Int32
, quindi l'intera operazione viene eseguita utilizzando l'aritmetica Int32
, quindi il risultato Int32
viene promosso a lungo.
Modificalo in questo:
Int64 a = 256*256*256*128L;
e tutto andrà bene.
Altri suggerimenti
Usa:
Int64 a = 256L*256L*256L*128L;
il suffisso L significa Int64 letterale, nessun suffisso significa Int32.
Cosa hai scritto:
Int64 a = 256*256*256*128
significa:
Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow