Предполагая, что у вас есть два 32-разрядных DWORD x и y, как вы можете определить, приведет ли их сумма к переполнению, но не прибегая к сборке для проверки флага переноса. Мне бы хотелось что-то с арифметическими или двоичными операторами. Я понял, что могут быть некоторые методы тестирования бит, чтобы понять это. СпасибоОбнаружение 32-разрядного dword + dword carry/C++
ответ
Если в значительной степени сэкономить предположить, скажите мне, если я пропустил какой-либо случай (это не будет работать в компиляторах, придерживающихся 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;
}
Подписанное целочисленное переполнение - это неопределенное поведение. – dreamlax
Поскольку поведение для целочисленного переполнения со знаком не определено, оптимизаторы компилятора могут *** и *** делают предположение, что ваш код не приводит к переполнению целых чисел со знаком. См. [Здесь] (http://www.airs.com/blog/archives/120) для получения дополнительной информации. – dreamlax
dreamlax правильный. подписанное поведение переполнения не указано в C++, и ваш подход может зависеть не только от конкретной архитектуры процессора, но и от режима, в котором он сейчас находится. Очень опасно и неспособен. – kkm
возможный дубликат [Получение «нести» в х + у] (http://stackoverflow.com/questions/6092102/getting-carry-in-xy) –