Увеличение целочисленного значения за пределы его целочисленного предела - C#

StackOverflow https://stackoverflow.com/questions/3108022

  •  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#.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top