3 ms·
This doesn't work because you're not left-shifting (doubling) the carry. But when adding the shifted carry to (x ^ y) we're back to potentially overflowing the
by nonsequitur 5y ago
This doesn't work because you're not left-shifting (doubling) the carry. But when adding the shifted carry to (x ^ y) we're back to potentially overflowing the highest bits.
The solution is to add the highest and the lower bits separately:
lower = 0x7f7f7f7f;
highest = ~lower;
z = ((x & lower) + (y & lower)) ^ ((x ^ y) & highest);
Note this only improves performance for larger container integers.
- rustybolt 5y agoYou're completely right! Typically you don't care about overflow though (and you should use unsigned ints to avoid undefined behavior).