Почему я могу обойти ограничение int в C#
Как я могу сделать целочисленное переполнение? Возможно ли перехватить исключение переполнения в C#?
Код C#, который я использовал:
int overflow = 1;
for (int i = 0; i < 31; i++) {
overflow = overflow * 2;
Console.WriteLine(overflow);
}
Программа продолжит считать нормально, когда я увеличу значение целого числа на единицу (даже несколько раз):
for (int j = 0; j < 10; j++) {
overflow++;
Console.WriteLine(overflow);
}
Но когда я продолжу умножать его на 2, он всегда будет отвечать нулем.
Почему это происходит?
2 ответа
По умолчанию неконстантные выражения не проверяются на переполнение во время выполнения, и они не вызывают исключение переполнения.
Проверка переполнения может быть включена с помощью параметров компилятора, конфигурации среды или пользователя проверенного ключевого слова. Ключевое слово checked используется для явного включения проверки переполнения для арифметических операций и преобразований целочисленного типа.
Вот ваш код с проверенным ключевым словом witch выдает исключение переполнения:
checked
{
int overflow = 1;
for (int i = 0; i < 31; i++)
{
overflow = overflow * 2;
Console.WriteLine(overflow);
}
}
"Разве Windows не должна этому помешать?"
Это происходит, когда выдается ошибка, когда ваш int выходит за пределы:
переполнение: -2147483648
int.MaxValue: 2147483647
Если вы хотите, чтобы значение int (или int32) превышало 2147483647, вам, вероятно, следует использовать int64: https://msdn.microsoft.com/en-us/library/system.int64(v=vs.110).aspx
или Biginteger в этом отношении
https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx