Почему добавление двух больших целых чисел, результат которых больше 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# не будет.