Pergunta

Estou testemunhando um comportamento estranho em um programa de .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 que meus comporta de Int64 como se fossem Int32 de, embora Int64.MaxValue parece confirmar que eles estão usando 64 bits?

Se for relevante, estou usando um sistema operacional de 32 bits, e a plataforma de destino é definido como "Qualquer CPU"

Foi útil?

Solução

Seu RHS está apenas usando valores Int32, então toda a operação é realizada utilizando Int32 aritmética, então o Int32 Resultado é promovido para um longo.

Alterar-lo para o seguinte:

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

e tudo ficará bem.

Outras dicas

Use:

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

o meio L sufixo Int64 literal, nenhum sufixo significa Int32.

O seu escreveu:

Int64 a = 256*256*256*128

meios:

Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top