Арифметическая операция привела к переполнению. (Добавление целых чисел) - PullRequest
24 голосов
/ 21 января 2011

Я не могу понять эту ошибку:

В этом вызове метода SetVolume Volume = 2055786000 и size = 93552000. Volume является свойством Integer, а размер также является Integer, как вы можете видеть.

Класс является частичным классом класса сущности dbml, однако это свойство Volume НЕ является столбцом в базе данных, оно существует только в частичном классе как «свойство бизнес-объекта».

Подробнее показывает:

Данные> Элемент : Чтобы оценить индексированное свойство, свойство должно быть квалифицированным, а аргументы должны быть явно предоставлены пользователем.

alt text

Что может вызвать это ...?

Ответы [ 8 ]

34 голосов
/ 21 января 2011

Максимальное значение целого числа (которое подписано) составляет 2147483647.Если это значение переполняется, создается исключение, чтобы предотвратить непредвиденное поведение вашей программы.

Если это исключение не будет сгенерировано, у вас будет значение -2145629296 для вашего Volume, что, скорее всего, нежелательно.

Решение: используйте Int64 для вашего объема.При максимальном значении 9223372036854775807 вы, вероятно, в большей безопасности.

7 голосов
/ 21 января 2011
int.MaxValue = 2147483647
2055786000 + 93552000 = 2149338000 > int.MaxValue

Таким образом, вы не можете сохранить этот номер в целое число. Вы можете использовать тип Int64 с максимальным значением 9,223,372,036,854,775,807.

3 голосов
/ 23 августа 2013

Для простоты я буду использовать байты:

byte a=250;
byte b=8;
byte c=a+b;

, если a, b и c были бы 'int', вы ожидаете 258, но в случае 'байтов' ожидаемый результат будет2 (258 & 0xFF), но в приложении Windows вы получаете исключение, а в консоли - нет (не знаю, но это может зависеть от IDE, я использую SharpDevelop).

Иногда,однако такое поведение желательно (например, вас интересуют только младшие 8 битов результата).

Вы можете сделать следующее:

byte a=250;
byte b=8;

byte c=(byte)((int)a + (int)b);

Таким образом, и "a", и "b 'преобразуются в' int ', добавляются, затем преобразуются обратно в' byte '.

Чтобы быть в безопасности, вы также можете попробовать:

...
byte c=(byte)(((int)a + (int)b) & 0xFF);

Или, еслиВы действительно хотите такое поведение, гораздо более простой способ сделать это:

unchecked
{
    byte a=250;
    byte b=8;
    byte c=a+b;
}

Или сначала объявить свои переменные, а затем выполнить математические операции в разделе «unchecked».

Альтернативно,если вы хотите принудительно проверить переполнение, вместо этого используйте «флажок».

Надеюсь, что все прояснится.

Nurchi

PS

Поверь мне, это исключение - твой друг:)

2 голосов
/ 21 января 2011

Целевое значение результата находится вне диапазона, который может содержать целочисленный тип данных.

Попробуйте использовать Int64

1 голос
/ 21 января 2011

Максимальное значение для int равно 2147483647, поэтому 2055786000 + 93552000> 2147483647, и это вызвало переполнение

0 голосов
/ 07 апреля 2014

Эта ошибка произошла для меня, когда значение было возвращено как -1. # IND из-за деления на ноль.Больше информации об исключениях IEEE с плавающей точкой в ​​C ++ здесь, на SO и от John Cook

Для того, кто отклонил этот ответ (и не указал, почему)причина, по которой этот ответ может быть значимым для некоторых, заключается в том, что деление на ноль приведет к бесконечно большому числу и, следовательно, к значению, которое не помещается в Int32 (или даже Int64).Таким образом, полученная вами ошибка будет такой же (арифметическая операция привела к переполнению), но причина немного другая.

0 голосов
/ 21 января 2011

Максимальный размер для int - 2147483647. Вы можете использовать Int64 / Long, который намного больше.

0 голосов
/ 21 января 2011

2055786000 + 93552000 = 2149338000, что больше 2 ^ 31. Поэтому, если вы используете целые числа со знаком, закодированные в 4 байта, результат операции не будет соответствовать и вы получите исключение переполнения.

...