记录一个整型溢出的问题

662 阅读1分钟

在做一道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(范围小的向范围大的转换),便不会再溢出。