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

Не должно ли это переполнение? Это не так!

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

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

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

<П > -5670418394979206991

Это явно переполнено, но никаких исключений не возникает. Я бы хотел, чтобы его подняли, но...

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

  • Откройте диалоговое окно Свойства страницы. Подробнее см. Настройка свойств проекта Visual С#.
  • Щелкните папку Свойства конфигурации.
  • Перейдите на страницу свойств Создать.
  • Измените свойство Проверить свойство арифметического переполнения/недогрузки.

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

Ответ 3

Try:

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

Ответ 4

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

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

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