Подтвердить что ты не робот

Возможно ли получить доступ к регистру флагов переполнения в CPU с С++?

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

4b9b3361

Ответ 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.