Арифметическая операция привела к переполнению. (Добавление целых чисел)
Я не могу понять эту ошибку:
В этом вызове метода SetVolume, Volume = 2055786000 и size = 93552000. Volume является свойством Integer, а размер также является Integer, как вы можете видеть.
Класс является частичным классом класса сущности dbml, однако это свойство Volume НЕ является столбцом в базе данных, оно существует только в частичном классе как "свойство бизнес-объекта".
Посмотреть детали показывает:
Данные> Элемент: чтобы оценить индексированное свойство, свойство должно быть квалифицированным, а аргументы должны быть явно предоставлены пользователем.
Что может вызвать это...?
8 ответов
Максимальное значение целого числа (которое подписано) 2147483647
, Если это значение переполняется, генерируется исключение, чтобы предотвратить непредвиденное поведение вашей программы.
Если это исключение не будет выброшено, у вас будет значение -2145629296
для тебя Volume
что, скорее всего, не требуется.
Решение: использовать Int64
для вашего объема. С максимальным значением 9223372036854775807
Вы, вероятно, больше на безопасной стороне.
int.MaxValue = 2147483647
2055786000 + 93552000 = 2149338000 > int.MaxValue
Таким образом, вы не можете сохранить этот номер в целое число. Вы можете использовать тип Int64 с максимальным значением 9,223,372,036,854,775,807
,
Для простоты я буду использовать байты:
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;
}
Или сначала объявите свои переменные, затем сделайте математику в разделе "непроверенный".
В качестве альтернативы, если вы хотите принудительно проверить переполнение, используйте вместо него "флажок".
Надеюсь, это прояснит ситуацию.
Nurchi
PS
Поверь мне, это исключение твой друг:)
Целочисленное значение результата находится вне диапазона, который может содержать целочисленный тип данных.
Попробуйте использовать Int64
Максимальное значение для int составляет 2147483647, поэтому 2055786000+93552000 > 2147483647, и это вызвало переполнение
Эта ошибка произошла для меня, когда значение было возвращено как -1.#IND из-за деления на ноль. Больше информации об исключениях с плавающей точкой IEEE в C++ здесь на SO и Джон Кук
Для того, кто проголосовал против этого ответа (и не указал, почему), причина, по которой этот ответ может быть значимым для некоторых, заключается в том, что деление на ноль приведет к бесконечно большому числу и, следовательно, к значению, которое не помещается в Int32 (или даже Int64). Таким образом, ошибка, которую вы получите, будет такой же (арифметическая операция привела к переполнению), но причина немного другая.
2055786000 + 93552000 = 2149338000, что больше 2^31. Поэтому, если вы используете целые числа со знаком, закодированные в 4 байта, результат операции не подходит, и вы получите исключение переполнения.
Максимальный размер для int - 2147483647. Вы можете использовать Int64/Long, который намного больше.