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