Подтвердить что ты не робот

Арифметическая операция привела к переполнению. (Добавление целых чисел)

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

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

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

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

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

alt text

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

4b9b3361

Ответ 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). Таким образом, полученная вами ошибка будет одинаковой (операция арифметики привела к переполнению), но причина немного отличается.