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

Что такое ошибка переполнения целого числа?

Что такое ошибка переполнения целого числа? Почему я так беспокоюсь о такой ошибке? Каковы некоторые способы избежать или предотвратить это?

4b9b3361

Ответ 1

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

Если вы попытаетесь выразить число 300 в одном байте, у вас будет целочисленное переполнение (максимум 255). 100 000 в двух байтах также является переполнением целых чисел (65 535 - это максимум).

Вам нужно заботиться об этом, потому что математические операции не будут вести себя так, как вы ожидаете. A + B фактически не равен сумме A и B, если у вас есть переполнение целых чисел.

Вы избегаете этого, не создавая условия в первую очередь (обычно либо путем выбора целочисленного типа, чтобы быть достаточно большим, чтобы вы не переполняли, либо ограничивая ввод пользователя, чтобы переполнение не происходило).

Ответ 2

Самый простой способ объяснить это с помощью тривиального примера. Представьте, что у нас есть 4-битное целое число без знака. 0 будет 0000, а 1111 - 15. Поэтому, если вы увеличиваете 15 вместо 16, вы обмениваетесь назад до 0000, так как 16 на самом деле 10000, и мы не можем представить это с менее чем 5 байтами. Переполнение Ergo.

На практике числа намного больше и округляются до большого отрицательного числа при переполнении, если int подписывается, но в основном это происходит.

Еще один способ взглянуть на это - считать это в основном тем же самым, что случается, когда одометр в вашем автомобиле снова перевернется на ноль после удара 999999 км/миль

Ответ 3

Когда вы храните целое число в памяти, компьютер сохраняет его в виде серии байтов. Они могут быть представлены как серия единиц и нулей.

Например, нуль будет представлен как 00000000 (8-битные целые числа), и часто 127 будет представлен как 01111111. Если вы добавите один из 127, это будет "переворачивать" биты и заменять его на 10000000, но в стандартном двух комплиментах, это фактически используется для представления -128. Это "переполняет" значение.

С беззнаковыми числами происходит одно и то же: 255 (11111111) плюс 1 станет 100000000, но поскольку есть только 8 "бит", это заканчивается как 00000000, которое равно 0.

Вы можете избежать этого, выполнив правильную проверку диапазона для вашего правильного целочисленного размера или используя язык, который делает правильную обработку исключений для вас.

Ответ 4

Я бы хотел быть немного противоположным ко всем остальным ответам, которые каким-то образом принимают дрянную сломанную математику как данность. Вопрос связан с языком-агностиком и на огромном количестве языков, целые числа просто никогда не переполняются, поэтому вот мой вид саркастического ответа:

Что такое ошибка переполнения целого числа?

Устаревший артефакт из темных поколений компьютеров.

почему мне это нужно?

Нет.

как его можно избежать?

Используйте современный язык программирования, в котором целые числа не переполняются. (Lisp, Scheme, Smalltalk, Self, Ruby, Newspeak, Ioke, Haskell, возьмите свой выбор...)

Ответ 5

Ошибка целочисленного переполнения возникает, когда операция делает целочисленное значение больше максимального.

Например, если максимальное значение, которое вы можете получить, равно 100000, а ваше текущее значение равно 99999, тогда добавление 2 сделает его "переполнением".

Вы должны заботиться о переполнении целых чисел, потому что данные могут быть изменены или потеряны непреднамеренно и могут избежать их либо с большим целым типом (см. long int на большинстве языков), либо с помощью схемы, которая преобразует длинные строки цифр в очень большие целые числа.

Ответ 6

Переполнение происходит, когда результат арифметической операции не соответствует типу данных операции. У вас может быть переполнение с байтом без знака, если вы добавите 255 + 1, потому что результат (256) не подходит в 8 бит байта.

У вас может быть переполнение с номером с плавающей запятой, если результат операции с плавающей запятой слишком велик, чтобы представлять в экспоненте типа данных с плавающей точкой или мантиссы.

Вы также можете иметь недополнение с типами с плавающей точкой, когда результат операции с плавающей запятой слишком мал, чтобы представлять в заданном типе данных с плавающей точкой. Например, если тип данных с плавающей запятой может обрабатывать показатели в диапазоне от -100 до +100, и вы присваиваете значение с показателем -80, результат будет иметь показатель около -160, который не будет соответствовать заданный тип данных с плавающей запятой.

Вам нужно беспокоиться о переполнениях и потоках в вашем коде, потому что это может быть тихий убийца: ваш код производит неправильные результаты, но может не сигнализировать об ошибке.

Независимо от того, можете ли вы спокойно игнорировать переполнения, многое зависит от характера вашей программы. Изображения пикселей экрана из 3D-данных имеют гораздо больший допуск для числовых ошибок, чем, скажем, финансовые расчеты.

Проверка переполнения часто отключается в настройках компилятора по умолчанию. Зачем? Поскольку дополнительный код для проверки переполнения после каждой операции требует времени и пространства, что может ухудшить производительность вашего кода во время выполнения.

Сделайте себе одолжение и, по крайней мере, разработайте и протестируйте свой код с включенной проверкой переполнения.

Ответ 7

От wikipedia:

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

Вы должны заботиться об этом, особенно при выборе подходящих типов данных для своей программы, или вы можете получить очень тонкие ошибки.

Ответ 8

От http://www.first.org/conference/2006/papers/seacord-robert-slides.pdf:

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

P.S.: В PDF есть подробное объяснение переполнений и других целочисленных условий ошибки, а также способы их устранения/предотвращения.

Ответ 9

Это происходит, когда вы пытаетесь использовать целое число для значения, которое больше, чем внутренняя структура целого может поддерживать из-за количества используемых байтов. Например, если максимальный целочисленный размер равен 2,147,483,647, и вы пытаетесь сохранить 3 000 000 000, вы получите ошибку переполнения целых чисел.