Подтвердить что ты не робот

UInt64 и "Операция переполняется во время компиляции в режиме проверки"

Это похоже на глупый вопрос, но я не вижу ответа. У меня есть UInt64, который должен иметь максимальное значение

UInt64.MaxValue 18446744073709551615

Однако, когда я пытаюсь назначить небольшое число, я получаю эту ошибку переполнения "Переполнение операции во время компиляции в режиме проверки". Если я упакую его в "непроверенный" блок, тогда он компилируется и запускается так, как будто эта переменная равна нулю:

UInt64 value1 = 1073741824 * 8; // Compile error
UInt64 value2 = 8589934592;     // Actual value - no error

Почему это происходит?

4b9b3361

Ответ 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;

и проблема исчезнет.