I know that when overflow occurs in C/C++, normal behavior is to wrap-around. For example, INT_MAX+1 is an overflow.
Is possible to modify this behavior, so binary addition takes place as normal addition and there is no wraparound at the end of addition operation ?
Some Code so this would make sense. Basically, this is one bit (full) added, it adds bit by bit in 32
int adder(int x, int y)
{
int sum;
for (int i = 0; i < 31; i++)
{
sum = x ^ y;
int carry = x & y;
x = sum;
y = carry << 1;
}
return sum;
}
If I try to adder(INT_MAX, 1); it actually overflows, even though, I amn’t using + operator.
Thanks !
Overflow means that the result of an addition would exceed
std::numeric_limits<int>::max()(back in C days, we usedINT_MAX). Performing such an addition results in undefined behavior. The machine could crash and still comply with the C++ standard. Although you’re more likely to getINT_MINas a result, there’s really no advantage to depending on any result at all.The solution is to perform subtraction instead of addition, to prevent overflow and take a special case:
Without knowing the desired result, I can’t be more specific about the it. The performance impact should be minimal, as a rarely-taken branch can usually be retired in parallel with subsequent instructions without delaying them.
Edit: To simply do math without worrying about overflow or handling it yourself, use a bignum library such as GMP. It’s quite portable, and usually the best on any given platform. It has C and C++ interfaces. Do not write your own assembly. The result would be unportable, suboptimal, and the interface would be your responsibility!