写一个两个int相加防止溢出的函数。 写一个两个int相乘防止溢出的函数。
时间: 2024-05-02 17:21:08 浏览: 8
两个int相加防止溢出的函数:
```c++
int add_without_overflow(int a, int b) {
if (b > 0 && a > INT_MAX - b) {
return INT_MAX;
}
if (b < 0 && a < INT_MIN - b) {
return INT_MIN;
}
return a + b;
}
```
两个int相乘防止溢出的函数:
```c++
int multiply_without_overflow(int a, int b) {
if (a == 0 || b == 0) {
return 0;
}
if (a == INT_MIN && b == -1) {
return INT_MAX;
}
int sign = ((a < 0) ^ (b < 0)) ? -1 : 1;
a = abs(a);
b = abs(b);
int res = 0;
while (b > 0) {
if (b & 1) {
if (res > INT_MAX - a) {
return INT_MAX;
}
res += a;
}
if (a > INT_MAX >> 1) {
return INT_MAX;
}
a <<= 1;
b >>= 1;
}
return sign * res;
}
```
这里使用了位运算来实现乘法,通过每次将b的最后一位取出来,判断是否需要加上a,并把a乘以2,b除以2,重复这个过程直到b变成0,得到最终的结果。同时,在每次加法之前,都需要判断是否会溢出。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)