Почему добавление двух больших целых чисел, результат которых больше int.MaxValue, не вызывает исключения переполнения? - PullRequest
3 голосов
/ 19 августа 2011

Если мы используем следующий цикл в программе, цикл никогда не заканчивается в C # 4.0

for (int i = 1; i <= int.MaxValue; i++)
{
}

Это связано с тем, что добавление 1 к int.MaxValue (2147483647) не приведет к исключению переполнения, а приведет к -2147483648 (с учетом 32-битного int и комплимента 2).

int i = int.MaxValue;
Console.WriteLine(i + 1);

Кажется, поведение недавно изменилось. См. Вопрос Арифметическая операция вызвала OverflowException . Что может быть причиной этого изменения?

Ответы [ 2 ]

9 голосов
/ 19 августа 2011

Исключения переполнения для целых (и других целочисленных типов) выполняются только в контекстах checked.

Таким образом, это приведет к исключению:

checked
{
 int i = int.MaxValue;
  Console.WriteLine(i + 1);
}

Они не настроены на это по умолчанию, поскольку они стоят дороже, чем просто переполнение.

Из MSDN:

Ключевое слово selected используется для явного включения проверки переполнения для целочисленных значений.введите арифметические операции и преобразования.

И:

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


Это не недавнее изменение - C # был таким с первого дня.В этом вопросе вы видите код VB.NET, который по умолчанию находится в проверенном контексте.

Таким образом, при сохранении значений по умолчанию переполнение кода в VB.NET вызовет исключение, но идентичный код в C # будетнет.

2 голосов
/ 19 августа 2011
...