Разве это не должно вызывать Переполнение? Это не делает!

Что произошло с этим, так или иначе? Я делаю простое умножение:

Int64 x = 11111111111;
Int64 y = 11111111111;
Int64 z = x * y;

И в конце умножения, z показывает значение:

- 5670418394979206991

Это ясно переполнилось, но никакое исключение не повышено. Я хотел бы, чтобы был повышен, но...

Обратите внимание, что это находится на Windows Phone 7, но я не думаю, что это имеет любое влияние на проблему. Или он?

33
задан Cyberherbalist 29 May 2010 в 09:13
поделиться

4 ответа

Вы можете использовать проверяемый блок, как уже указывалось в других ответах:

checked
{
    long x = 11111111111;
    long y = 11111111111;
    long z = checked(x * y);
    // ...
}

Что приводит к исключению:

OverflowException: Арифметическая операция привела к переполнению.

Если вы выполняете только одну операцию, где вам нужна проверка, вы можете использовать checked expression вместо этого:

long x = 11111111111;
long y = 11111111111;
long z = checked(x * y);

Вы также можете установить опцию компилятора /checked, чтобы по умолчанию была проверка.

Чтобы установить эту опцию компилятора в среде разработки Visual Studio:

  1. Откройте диалоговое окно Property Pages проекта. Подробнее см. в разделе Установка свойств проекта Visual C#.
  2. Щелкните папку Configuration Properties.
  3. Щелкните страницу свойств Build.
  4. Измените свойство Check for Arithmetic Overflow/Underflow.

Если вы измените значение по умолчанию на checked, вы можете использовать непроверенные блоки или выражения, чтобы снова получить непроверенное поведение.

43
ответ дан 27 November 2019 в 17:46
поделиться

Компилятор предполагает, что вы хотите сделать это таким образом, и продолжите переполнение. Если переполнение необходимо рассматривать как исключение для операции, оберните операцию вокруг , отмеченного , и это вызовет исключение во время выполнения.

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}

System.OverflowException: исключение типа System.OverflowException было брошен.

8
ответ дан 27 November 2019 в 17:46
поделиться

Попробуйте:

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}
8
ответ дан 27 November 2019 в 17:46
поделиться

Проверьте :

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}
26
ответ дан 27 November 2019 в 17:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: