Увеличение целочисленного значения за пределы его целочисленного предела - C#
-
29-09-2019 - |
Вопрос
У меня есть цикл, который сохраняет увеличение целочисленного значения до завершения цикла. Таким образом, если предел n является двойной переменной, а увеличенная переменная «i» - целое число, я увеличивается за пределы ее пределов.
double total = 0;
double number = hugetValue;
for (int i = 1; i <= number; i++)
{
total = total + i;
}
return total;
Что происходит с «я», если он превышает свою способность? Как меняется ценность? Я получу ошибку во время выполнения?
Спасибо
Нл
Решение
Похоже на поведение в некоторых имплантациях C, где int
Просто оборачивается от int_max до int_min (хотя на самом деле это неопределенное поведение в соответствии со стандартом ISO), C# также обертывает. Тестирование в VS2008 с:
int x = 2147483647;
if (x+1 < x) {
MessageBox.Show("It wrapped...");
}
приведет к появлению окна сообщения.
Если ваш hugetValue
больше, чем максимум int
Значение, тогда ваш цикл будет работать навсегда из -за этого.
Например, если это 2147483648
, так же, как вы думаете, что приближаетесь к этому, int
Объединяется с 2147483647
вернуться к -2147483648
И петля просто продолжает идти.
Другие советы
Приносим извинения, если это кажется грубым, но вы научитесь гораздо больше, попробовав это самостоятельно.
Отредактировано: AHA, так что вы попробовали это и получили неожиданные результаты. Как было объяснено в другом месте, C-подобные языки имеют тенденцию тихо обертывать целочисленную арифметику. На самом деле это довольно разумное поведение в целом, если стоимость проверки на переполнение высока. Как только вы узнаете, что это может произойти тщательно, особенно наблюдение за конструкцией в вашем примере.
Если вам нужно исключение, либо поставьте checked
опция компилятора или используйте checked
конструкция, предоставленная в C#.