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

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

В этом вызове метода 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, который намного больше.

Другие вопросы по тегам