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

Если мы используем следующий цикл в программе, цикл никогда не заканчивается в 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 ответа

Решение

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

Итак, это приведет к исключению:

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

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

Из MSDN:

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

А также:

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


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

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

Другие вопросы по тегам