UInt64 и "Операция переполняется во время компиляции в режиме проверки"
Это похоже на глупый вопрос, но я не вижу ответа. У меня есть UInt64, который должен иметь максимальное значение
UInt64.MaxValue 18446744073709551615
Однако, когда я пытаюсь назначить небольшое число, я получаю эту ошибку переполнения "Переполнение операции во время компиляции в режиме проверки". Если я упакую его в "непроверенный" блок, тогда он компилируется и запускается так, как будто эта переменная равна нулю:
UInt64 value1 = 1073741824 * 8; // Compile error
UInt64 value2 = 8589934592; // Actual value - no error
Почему это происходит?
Ответы
Ответ 1
Потому что:
UInt64 value1 = 1073741824 * 8;
Выполняет арифметику как 32-битное целое число, а затем преобразует ее в ulong
. Попробуйте:
UInt64 value1 = 1073741824UL * 8;
UL
означает, что литерал имеет длину без знака. Дополнительную информацию о буквальных суффиксах см. В разделе 2.4.4 Спецификации С#:
Если литерал суффикс UL, Ul, uL, ul, LU, Lu, lU или lu, он имеет тип ulong
Ответ 2
1073741824
является int
, а не a UInt64
.
Следовательно, ваше умножение переполняет предел 32-разрядного целого числа со знаком.
Добавьте суффикс ul
(unsigned long) в любой из операндов.
Ответ 3
У вас есть ошибка, потому что вы работаете с int
вместо long
1073741824 все еще int
(max для int
равно 2147483647).
Поэтому в первом случае вы получаете переполнение типа int
.
Измените первое выражение на:
UInt64 value1 = 1073741824L * 8;
и проблема исчезнет.