Арифметическая операция привела к переполнению. (Добавление целых чисел)
Я не могу понять эту ошибку:
В этом вызове метода SetVolume, Том= 2055786000 и размер= 93552000. Том является свойством Integer, а размер также является Integer, как вы можете видеть.
Класс является частичным классом класса сущностей dbml, однако это свойство тома НЕ является столбцом в базе данных, оно существует только в частичном классе, как "свойство бизнес-объекта".
Показать подробности показывает:
Данные > Элемент. Чтобы оценить индексированное свойство, свойство должно быть квалифицированным, а аргументы должны быть явно предоставлены пользователем.
![alt text]()
Что может вызвать это...?
Ответы
Ответ 1
Максимальное значение целого числа (которое подписано) равно 2147483647
. Если это значение переполняется, генерируется исключение, чтобы предотвратить непредвиденное поведение вашей программы.
Если это исключение не будет выбрано, у вас будет значение -2145629296
для вашего Volume
, что, скорее всего, не требуется.
Решение. Используйте Int64
для вашего тома. При максимальном значении 9223372036854775807
вы, вероятно, более безопасны.
Ответ 2
int.MaxValue = 2147483647
2055786000 + 93552000 = 2149338000 > int.MaxValue
Таким образом, вы не можете сохранить это число в целое число. Вы можете использовать Int64 тип, который имеет максимальное значение 9,223,372,036,854,775,807
.
Ответ 3
Для простоты я буду использовать байты:
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 c=(byte)(((int)a + (int)b) & 0xFF);
Или, если вы действительно хотите этого поведения, гораздо более простой способ сделать это:
unchecked
{
byte a=250;
byte b=8;
byte c=a+b;
}
Или сначала объявите свои переменные, затем выполните математику в разделе "unchecked".
В качестве альтернативы, если вы хотите принудительно выполнить проверку переполнения, вместо этого используйте "checked".
Надеюсь, что это прояснит ситуацию.
Nurchi
P.S.
Поверьте мне, это исключение - ваш друг:)
Ответ 4
Целочисленное значение результата выходит за пределы диапазона, в котором может сохраняться целочисленный тип данных.
Попробуйте использовать Int64
Ответ 5
Максимальное значение fo int равно 2147483647, поэтому 2055786000 + 93552000 > 2147483647 и вызвало переполнение
Ответ 6
2055786000 + 93552000 = 2149338000, что больше 2 ^ 31. Поэтому, если вы используете знаковые целые числа, закодированные по 4 байтам, результат операции не подходит, и вы получаете исключение переполнения.
Ответ 7
Максимальный размер для int - 2147483647. Вы можете использовать Int64/Long, который намного больше.
Ответ 8
Эта ошибка возникла для меня, когда значение было возвращено как -1. # IND из-за деления на ноль.
Дополнительная информация о исключениях с плавающей запятой IEEE в С++ здесь на SO и от Джона Кука
Для того, кто отклонил этот ответ (и не указал почему), причина, по которой этот ответ может быть значительным для некоторых, заключается в том, что деление на ноль приведет к бесконечно большому числу и, следовательно, к значению, которое не встраивается в Int32 (или даже Int64).
Таким образом, полученная вами ошибка будет одинаковой (операция арифметики привела к переполнению), но причина немного отличается.