(long)(middle * middle) 与(long)middle * middle有什么

leetcode 367题:给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
遇到了如下问题:(long)(middle * middle)就会报越界,而(long)middle * middle就不会,求帮忙解答,不胜感激!!代码如下:
class Solution {
public:
    bool isPerfectSquare(int num) {
        
        if(num == 1)
        {
            return true;
        }

        int left = 0;
        int right = num;
        while(left <= right)
        {
            int middle = left + (right - left) / 2;
            if((long long)(middle * middle) < num)
            {
                left = middle + 1;
            }
            else if((long long)middle * middle > num)
            {
                right = middle - 1;
            }
            else
            {
                return true;
            }

        }
        return false;

    }
};
运行结果及报错内容
执行出错信息:

Line 15: Char 35: runtime error: signed integer overflow: 1000052909 * 1000052909 cannot be represented in type 'int' (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:24:35

最后执行的输入:

2000105819

middle 是int类型
(long long)(middle * middle)是先计算middle * middle结果还是int类型,如果这时结果超出int类型范围就直接变成负数.之后再转为long long类型也是没用的
而(long long)middle * middle是先把前面的middle转成long long类型,再与后面的middle相乘结果就是long long类型. 也就不会因为超出int类型范围而变成负数了

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

middle * middle的结果是int 型,如果middle的值比较大,结果会溢出
(long long)middle * middle是先将第一个middle先转换为long long型,然后再相乘,结果就是long long型

(long long)(middle * middle)是把乘法计算的结果转换为long long,但是middle * middle仍然按int类型计算,所以越界
(long long)middle * middle是先把第一个middle转换为long long,然后计算*,第二个middle也跟着提升为long long,这样就是long long类型的乘积,不会越界