После выполнения математической операции, например, для умножения двух целых чисел, можно ли получить доступ к регистру флагов переполнения в CPU с С++? Если нет других быстрых способов проверки переполнения?
Возможно ли получить доступ к регистру флагов переполнения в CPU с С++?
Ответ 1
Нет, вообще невозможно. Некоторые ЦП даже не имеют такого флага (например, MIPS).
Помните, что в C и С++ значении целочисленного переполнения вызывают поведение undefined, и по закону вы не можете выполнять проверки переполнения после факта. Вам либо нужно использовать арифметику без знака, либо выполнить проверки перед арифметическими операциями.
Ответ 2
Я рекомендую это чтение в каждом подходящем случае. Из Оптимизация программного обеспечения на С++ -
Целочисленное переполнение является другой проблемой безопасности. Официальный стандарт C говорит, что поведение целых чисел со знаком в случае переполнения "undefined". Это позволяет компилятору игнорировать переполнение или принимать что этого не происходит. В случае компилятора Gnu предположение что встречное целочисленное переполнение не происходит, имеет несчастный что позволяет компилятору оптимизировать переполнение проверить. Существует ряд возможных способов устранения этой проблемы: (1) проверить переполнение до его возникновения, (2) использовать целые числа без знака - они гарантированно обернутся вокруг, (3) переполнение цепочки целых чисел с помощью option
-ftrapv
, но это крайне неэффективно, (4) получить компилятор предупреждение для таких оптимизаций с опцией-Wstrict-overflow=2
или (5) сделать поведение переполнения корректным с опцией-fwrapv
или-fno-strict-overflow
.
Ответ 3
Это, вероятно, не то, что вы хотите сделать по двум причинам:
- не каждый процессор имеет флаг переполнения
- используя С++, на самом деле нет способа получить доступ к флажку переполнения
советы по проверке переполнения, которые были опубликованы ранее, могут быть полезны.
если вы действительно хотите написать быстрый код, который умножает два целых числа и проверяет флаг переполнения, вам придется использовать сборку. если вам нужны примеры для x86, тогда спросите
Ответ 4
Вам нужно будет выполнить операцию и проверить бит переполнения в встроенной сборке. Вы можете сделать это и перейти к метке при переполнении или (в общем, но менее эффективно) установить переменную, если она переполнена.
Ответ 5
Да, это возможно. Вы должны будете использовать немного асм.
inline bool isOverflow() {
_asm jo isOverflow_true
return false;
isOverflow_true:return true;
}
Это.
РЕДАКТИРОВАТЬ: По-видимому, не было ясно, что вам нужно использовать это после расчета, чтобы увидеть, если расчет переполняется. Поскольку вы не знаете, что компилятор будет делать с вашими вычислениями, он рекомендует выполнять вычисления также в asm.