2012-02-05 5 views
2

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

+0

возможный дубликат [Получение «нести» в х + у] (http://stackoverflow.com/questions/6092102/getting-carry-in-xy) –

ответ

5

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

DWORD sum = x + y; 
bool const overflow = (sum < x); 
+1

С x = 5 и y = -5 вы получите правду, несмотря на это не переполняется, так как сумма меньше х. – Mario

+1

@Mario: типы DWORD обычно не обозначены. – dreamlax

+0

Да, с этим предположением это работает. – Mario

1

Если в значительной степени сэкономить предположить, скажите мне, если я пропустил какой-либо случай (это не будет работать в компиляторах, придерживающихся 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; 
} 
+3

Подписанное целочисленное переполнение - это неопределенное поведение. – dreamlax

+0

Поскольку поведение для целочисленного переполнения со знаком не определено, оптимизаторы компилятора могут *** и *** делают предположение, что ваш код не приводит к переполнению целых чисел со знаком. См. [Здесь] (http://www.airs.com/blog/archives/120) для получения дополнительной информации. – dreamlax

+0

dreamlax правильный. подписанное поведение переполнения не указано в C++, и ваш подход может зависеть не только от конкретной архитектуры процессора, но и от режима, в котором он сейчас находится. Очень опасно и неспособен. – kkm

 Смежные вопросы

  • Нет связанных вопросов^_^