Почему мои .net Int64 ведут себя так, как если бы они были Int32?
-
06-07-2019 - |
Вопрос
Я наблюдаю странное поведение в программе .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;
Не связан с StackOverflow