Почему я могу обойти ограничение 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);
    }
}

проверено (C# Reference)

"Разве 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

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