Я имею для цикла, который продолжает увеличивать целочисленное значение, пока цикл не завершается. Таким образом, если предел n является двойной переменной и увеличенной переменной, 'я' - целое число, я увеличен вне его пределов.
double total = 0;
double number = hugetValue;
for (int i = 1; i <= number; i++)
{
total = total + i;
}
return total;
Что происходит со 'мной', если это превышает свою способность? Как значение я изменяюсь? Я получу ошибку периода выполнения?
Спасибо
NLV
Подобно поведению в некоторых реализациях C, где int
просто переходит от INT_MAX к INT_MIN (хотя на самом деле это поведение undefined согласно стандарту ISO), C # также оборачивается. Тестирование в VS2008 с:
int x = 2147483647;
if (x+1 < x) {
MessageBox.Show("It wrapped...");
}
приведет к появлению окна сообщения.
Если ваше hugetValue
больше максимального значения int
, то из-за этого ваш цикл будет выполняться вечно.
Например, если это 2147483648
, то, когда вы думаете, что приближаетесь к нему, int
переносится с 2147483647
обратно на -2147483648
и цикл просто продолжается.
Если вам нужно исключение, либо поставьте опцию компилятора checked
, либо используйте конструкцию checked
, предусмотренную в C#.
Приносим извинения, если это покажется грубым, но вы узнаете гораздо больше, попробовав это сами.
Отредактировано: ага, значит, вы попробовали и получили неожиданные результаты. Как объяснялось в другом месте, C-подобные языки обычно незаметно переносят целочисленную арифметику. На самом деле это вполне разумное поведение в целом, если стоимость проверки переполнения высока. Как только вы узнаете, что это может произойти, нужно внимательно кодировать, особенно наблюдая за конструкцией в вашем примере.