Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

От Википедия:

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

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

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

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

PS: PDF имеет подробное объяснение по переполнению и другим целочисленным условиям ошибок, а также как решать / избежать их.

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

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

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

Почему я забочусь об этом?

Вы не делаете.

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

Используйте современный язык программирования, в котором целые числа не переполняются. (Lisp, схема, smalltalk, self, ruby, newspeak, ooke, haskell, возьми тебя ...)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top