Почему мои .net Int64 ведут себя так, как если бы они были Int32?

StackOverflow https://stackoverflow.com/questions/829555

Вопрос

Я наблюдаю странное поведение в программе .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-разрядную ОС, а целевой платформой является "Любой процессор".

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top