Целочисленное переполнение


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

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

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

Для некоторых приложений, таких как таймеры и часы, может быть желателен перенос при переполнении. Стандарт C11 гласит, что для целых чисел без знака перенос по модулю является определенным поведением, и термин переполнение никогда не применяется: «вычисление, включающее операнды без знака, никогда не может переполниться». [1]

На некоторых процессорах, таких как графические процессоры (GPU) и цифровые сигнальные процессоры (DSP), которые поддерживают арифметику насыщения , переполненные результаты будут «зажаты», т. е. установлены на минимальное или максимальное значение в представляемом диапазоне, а не зациклены.

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


Целочисленное переполнение можно продемонстрировать через переполнение одометра , механическую версию явления. Все цифры устанавливаются на максимум 9, и следующее увеличение белой цифры вызывает каскад переносных добавлений, устанавливающих все цифры на 0, но нет старшей цифры (цифра 1 000 000), которая изменится на 1, поэтому счетчик сбрасывается на ноль. Это обертывание в отличие от насыщения .
Ошибка целочисленной подписи в коде настройки стека, выдаваемая компилятором Pascal, не позволяла Microsoft/IBM MACRO Assembler версии 1.00 (MASM), программе DOS 1981 года и многим другим программам, скомпилированным с помощью того же компилятора, работать в некоторых конфигурациях с более чем 512 КБ памяти.