В компьютерном программировании целочисленное переполнение происходит, когда арифметическая операция пытается создать числовое значение, выходящее за пределы диапазона, который может быть представлен заданным количеством цифр — либо выше максимального, либо ниже минимального представимого значения.
Наиболее распространенным результатом переполнения является то, что сохраняются наименее значащие представимые цифры результата; говорят, что результат охватывает максимум (т . е. по модулю степени основания , обычно два в современных компьютерах, но иногда десять или другое основание).
Состояние переполнения может привести к непреднамеренному поведению. В частности, если такая возможность не была предусмотрена, переполнение может поставить под угрозу надежность и безопасность программы .
Для некоторых приложений, таких как таймеры и часы, может быть желателен перенос при переполнении. Стандарт C11 гласит, что для целых чисел без знака перенос по модулю является определенным поведением, и термин переполнение никогда не применяется: «вычисление, включающее операнды без знака, никогда не может переполниться». [1]
На некоторых процессорах, таких как графические процессоры (GPU) и цифровые сигнальные процессоры (DSP), которые поддерживают арифметику насыщения , переполненные результаты будут «зажаты», т. е. установлены на минимальное или максимальное значение в представляемом диапазоне, а не зациклены.
Ширина регистра процессора определяет диапазон значений, которые могут быть представлены в его регистрах. Хотя подавляющее большинство компьютеров могут выполнять арифметические операции с множественной точностью над операндами в памяти, что позволяет делать числа произвольно длинными и избегать переполнения, ширина регистра ограничивает размеры чисел, с которыми можно работать (например, складывать или вычитать) с помощью одна инструкция на операцию. Типичная ширина двоичного регистра для целых чисел без знака включает: