Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int saturating_add(int u, int v)
- {
- unsigned s = (unsigned)(u + v);
- // overflow test
- unsigned q = s - u;
- unsigned p = q >> 31; // if this is 1, we have an overflow
- // underflow test
- unsigned p1 = (u >> 31) & (v >> 31); // if 1, they're both < 0
- unsigned p2 = (p1 ^ (s >> 31)) & ((s >> 31) == 0); // if 1, we have an underflow
- return (int)((s & (0xFFFFFFFF + (p2 | p))) | (INT_MIN & (INT_MAX + p2)) | (INT_MAX & (INT_MIN - p)));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement