Почему мой .net Int64 ведет себя так, как если бы он был Int32? - PullRequest
7 голосов
/ 06 мая 2009

Я наблюдаю странное поведение в программе .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.

Почему мои Int64 ведут себя так, как если бы они были Int32, хотя Int64.MaxValue, кажется, подтверждает, что они используют 64 бита?

Если это актуально, я использую 32-битную ОС, а для целевой платформы установлено значение «Любой ЦП»

Ответы [ 2 ]

20 голосов
/ 06 мая 2009

Ваша RHS использует только значения Int32, поэтому вся операция выполняется с использованием арифметики Int32, затем результат Int32 переводится в длинное.

Измените это на:

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

и все будет хорошо.

4 голосов
/ 06 мая 2009

Использование:

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

суффикс L означает литерал Int64, без суффикса - Int32.

Что вы написали:

Int64 a = 256*256*256*128

означает:

Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128;
...