在做一道leetcode题目时,中间有一行代码是这么写的:
int mySqrt(int x) {
int left = 0, right = x;
int result = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (mid * mid <= x) { // 这一行会报错
left = mid + 1;
result = mid;
} else {
right = mid - 1;
}
}
return result;
}
在提交运行的时候,其中一个测试用例会报错如下:
runtime error: signed integer overflow: 1073697799 * 1073697799 cannot be represented in type 'int'
这是因为两个int相乘会隐式转为 int tmp = mid * mid,就会导致溢出的情况。
如果写成if ((long long)(mid * mid) <= x) 一样会溢出,道理一样。
正确的写法是if ((long long)mid * mid <= x) 即将前一个mid转为long long类型,再与后一个mid相乘,这样后面的mid也会强制转为long long(范围小的向范围大的转换),便不会再溢出。