Detecting a unsigned integer overflow in a c function
The expression n /= 2;
should never overflow, so I’m not worried about that.
The question I think you’re asking is:
Will n = (3 * n) + 1;
ever overflow?
That can be answered as an inequality:
- If
(3 * n) + 1 > UINT64_MAX
, then you have Overflow.
And that is an inequality you can solve algebraically.
- If
(3*n) > UINT64_MAX-1
, then you have Overflow - If
n > (UINT64_MAX-1)/3
, then you have Overflow
So, ultimately, if n > (UINT64_MAX-1)/3
(or approximately 6.1489e18
), then you cannot complete the calculation without overflowing uint64_t
.
Read more here: Source link