Обнаружение 32-битного меча + перенос меча / C ++ - PullRequest
2 голосов
/ 05 февраля 2012

Предполагая, что у вас есть два 32-битных DWORD x и y, как вы можете определить, приведет ли их сумма к переполнению, но не прибегая к нативной сборке для проверки флага переноса. Я хотел бы что-то с арифметическими или бинарными операторами. Я подумал, что могут быть некоторые методы тестирования, чтобы понять это. Спасибо

Ответы [ 2 ]

5 голосов
/ 05 февраля 2012

Почему бы не проверить сумму?

DWORD sum = x + y;
bool const overflow = (sum < x);
1 голос
/ 05 февраля 2012

Если в значительной степени сохранить предположения, скажите мне, если я пропустил какой-либо случай (это не будет работать в компиляторах, придерживающихся C ++ 98 или более новых стандартов):

int overflowSum(DWORD a, DWORD b) {
     return (b > 0) ? (a + b < a) : (a + b > a);
}

Если вы считаете свой DWORD неподписанным, вы можете упростить его:

int overflowSum(DWORD a, DWROD b) {
    return a + b < a;
}
...