Сборка — Можно ли получить доступ к регистру флага переполнения в ЦП с C ++?

После выполнения математической операции, скажем, умножения двух целых чисел, возможно ли получить доступ к регистру флага переполнения в ЦП с C ++? Если нет, то каковы другие быстрые способы проверки на переполнение?

9

Решение

Нет, вообще это невозможно. Некоторые процессоры даже не имеют такого флага (например, MIPS).

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

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

9

Другие решения

Я рекомендую это чтение в каждом соответствующем случае. От Оптимизация программного обеспечения на C ++

Целочисленное переполнение — еще одна проблема безопасности. Официальный стандарт C
говорит, что поведение целых чисел со знаком в случае переполнения
«Неопределенный». Это позволяет компилятору игнорировать переполнение или предполагать
что этого не происходит. В случае компилятора Gnu предположение
что целочисленное переполнение со знаком не происходит,
следствие того, что это позволяет компилятору оптимизировать переполнение
проверять. Существует ряд возможных способов решения этой проблемы:
(1) проверить переполнение до того, как оно произойдет, (2) использовать целые числа без знака —
они гарантированно обернуты, (3) переполнение целочисленного типа
вариант -ftrapv, но это крайне неэффективно, (4) получить компилятор
предупреждение о такой оптимизации с опцией
-Wstrict-overflow=2или (5) сделать поведение переполнения хорошо определенным с параметром
-fwrapv или же -fno-strict-overflow,

6

Это, вероятно, не то, что вы хотите сделать по двум причинам:

  1. не каждый процессор имеет флаг переполнения
  2. используя C ++, на самом деле нет способа получить доступ к флагу переполнения

полезные советы по проверке переполнения, которые ранее размещали люди.

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

0

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

0
По вопросам рекламы [email protected]