Флаг переполнения - Overflow flag

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

Например, предположим, что мы складываем 127 и 127, используя 8-битные регистры. 127 + 127 равно 254, но с использованием 8-битной арифметики результатом будет 1111 1110 двоичное, что является двоичным кодированием с дополнением -2, отрицательного числа. Отрицательная сумма положительных операндов (или наоборот) - это переполнение. Затем будет установлен флаг переполнения, чтобы программа могла знать о проблеме и смягчить ее или сигнализировать об ошибке. Таким образом, флаг переполнения устанавливается, когда самый старший бит (здесь считается битом знака) изменяется путем добавления двух чисел с одинаковым знаком (или вычитания двух чисел с противоположными знаками). Переполнение не может произойти, если знаки двух операндов сложения различаются (или знаки двух операндов вычитания одинаковы).

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

Внутри флаг переполнения обычно генерируется исключающим ИЛИ внутреннего переноса в знаковый бит и обратно .

Побитовые операции (и, или, xor, not, rotate) не имеют понятия подписанного переполнения, поэтому определенное значение варьируется в зависимости от архитектуры процессора; одни очищают бит безоговорочно, другие оставляют его без изменений и по-прежнему устанавливают неопределенное значение. Сдвиги и умножения допускают четко определенное значение, но оно не реализуется последовательно. Например, набор инструкций x86 определяет только флаг переполнения для умножений и 1-битных сдвигов; многобитовые сдвиги оставляют его неопределенным.

Рекомендации