2020-05-23 20:03:07 +03:00
|
|
|
#if defined __GNUC__
|
|
|
|
bool Int_safe_MINUS_add(int x, int y, int* res) {
|
|
|
|
return __builtin_add_overflow(x, y, res);
|
|
|
|
}
|
|
|
|
bool Int_safe_MINUS_sub(int x, int y, int* res) {
|
|
|
|
return __builtin_sub_overflow(x, y, res);
|
|
|
|
}
|
|
|
|
bool Int_safe_MINUS_mul(int x, int y, int* res) {
|
|
|
|
return __builtin_mul_overflow(x, y, res);
|
|
|
|
}
|
|
|
|
#else
|
2020-05-15 02:22:10 +03:00
|
|
|
bool Int_safe_MINUS_add(int x, int y, int* res) {
|
|
|
|
int r = x + y;
|
|
|
|
*res = r;
|
|
|
|
return (y > 0) && (x > (INT_MAX - y)) || (y < 0) && (x < (INT_MIN - y));
|
|
|
|
}
|
|
|
|
bool Int_safe_MINUS_sub(int x, int y, int* res) {
|
|
|
|
int r = x - y;
|
|
|
|
*res = r;
|
|
|
|
*res = x - y;
|
|
|
|
return (y > 0 && x < (INT_MIN + y)) || (y < 0 && x > (INT_MAX + y));
|
|
|
|
}
|
|
|
|
bool Int_safe_MINUS_mul(int x, int y, int* res) {
|
|
|
|
int r = x * y;
|
|
|
|
*res = r;
|
2020-05-16 18:57:55 +03:00
|
|
|
return y == 0 || (r / y) != x;
|
2020-05-15 02:22:10 +03:00
|
|
|
}
|
2020-04-24 11:28:00 +03:00
|
|
|
#endif
|