Приращение целочисленного значения за пределы его целочисленного предела - С#

У меня есть цикл for, который продолжает увеличивать целочисленное значение до завершения цикла. Поэтому, если предел n является двойной переменной, а приращенная переменная "i" является целым числом, я получает прирост за ее пределами.

 double total = 0;
 double number = hugetValue;
 for (int i = 1; i <= number; i++)
 {
    total = total + i;
 }
 return total;

Что происходит с "i", если оно превышает его емкость? Как изменяется значение i? Я получу ошибку времени выполнения?

Спасибо

NLV

Ответ 1

Подобно поведению в некоторых имплантациях C, где int просто обертывается из INT_MAX в INT_MIN (хотя это фактически поведение undefined в соответствии со стандартом ISO), С# также обертывает. Тестирование его в VS2008 с помощью:

int x = 2147483647;
if (x+1 < x) {
    MessageBox.Show("It wrapped...");
}

приведет к появлению окна сообщения.

Если ваш hugetValue больше максимального значения int, тогда ваш цикл будет работать вечно из-за этого.

Например, если он 2147483648, как вы думаете, вы приближаетесь к нему, int обертывается с 2147483647 обратно на -2147483648, и цикл продолжается.

Ответ 2

Извините, если это кажется грубым, но вы узнаете гораздо больше, попробовав это самостоятельно.

Отредактировано: ага, поэтому вы попробовали его и получили неожиданные результаты. Как объяснялось в другом месте, C-подобные языки имеют тенденцию спокойно обертывать целочисленную арифметику. Это на самом деле вполне разумное поведение в целом, если стоимость проверки на переполнение высока. Как только вы узнаете, что это может произойти, один код тщательно, особенно, наблюдая за конструкцией в вашем примере.

Ответ 3

Если вы хотите исключение, поставьте опцию checked компилятор или используйте конструкцию checked, представленную на С#.