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