我解决了一个编程问题,如果2位A和B,A和B的范围是0,10^9,我必须在乘积的二进制形式中找到1的个数。这是我写的代码。
public class Solution {
public static void main(String[] args) {
// System.out.println(solution(32329,4746475));
System.out.println(solution(3,4));
}
public static int solution(int A, int B) {
// write your code in Java SE 8
long mul=A*B;
int ans=0;
while(mul>0)
{
if((mul%2)!=0)
{
ans++;
}
mul=mul/2;
}
return ans;
}
}
这对于输入(3,4)很好,但是,当我尝试(32329,4746475)作为输入时,代码没有工作,它显示0作为答案。我在不同的地方放了几个输出语句来调试,发现使用这个输入,乘法的结果是-1170032381 (这是错误的),因此,while循环的条件失败了。所以,我把A和B都打成这样
long mul=(long)A*(long)B;
瞧,它起作用了。我的问题是为什么?为什么代码对于较小的输入很好,对于较大的输入却是失败的,而'int to long‘不应该是Java中的隐式类型转换?
(我也尝试过其他一些输入,所以不是所有较大的输入都是否定的,但它们也没有给出正确的答案,小的输入,直到5位数A和B给出正确的产品。)
发布于 2022-02-19 06:23:50
Java有从int
到long
的自动加宽,但这是在赋值时发生的,但是int
与另一个int
的相乘会产生一个int
,所以首先将整数溢出与4746475
相乘,然后将溢出的int
结果扩展为long
。
但是,如果首先将至少一个int
转换为long
,则使用long
进行乘法,结果是long
,因此没有整数溢出。
发布于 2022-02-19 06:26:58
Java int可以从
-2147483648 to 2147483647
32329 X 4746475 =153448790275
正如Java在隐式转换之前执行乘法一样,结果是错误的。
https://stackoverflow.com/questions/71185797
复制