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类型范围而变成负数了
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
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类型的乘积,不会越界