将两个整数相乘的结果存储在long中



我解决了一个编程问题,如果有2个数字a和B,我必须在乘积的二进制形式中找到1的个数。a和B的范围包括[0,10^9]。这是我写的代码。

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(很有效,但当我尝试(323294746475(作为输入时,代码不起作用,结果显示为0。我在不同的地方放入了一些输出语句进行调试,发现有了这个输入,乘法的结果是-1170032381(这是错误的(,因此while循环的条件失败了。所以,我键入了A和B,就像一样

long mul=(long)A*(long)B;

瞧,它奏效了。现在,我的问题是为什么?为什么代码对较小的输入很好,对较大的输入很失败,而在Java中"int to long"不应该是隐式类型转换?

(我还尝试了一些其他输入,所以不是所有较大的输入都是负数,但它们也没有给出正确的答案,较小的输入我一直尝试到5位数的a和B给出正确的乘积(

Java有从intlong的自动加宽,但这发生在赋值时,但int与另一个int的乘积会产生int,因此您将首先得到整数溢出323294746475相乘,然后将溢出的int结果加宽为long

但是,如果首先将至少一个int强制转换为long,则使用long进行乘法运算,结果为long,因此不会出现整数溢出。

Java int可以从存储

-2147483648 to 2147483647
32329 X 4746475 =153448790275

由于Java在隐式转换之前进行乘法运算,结果是错误的

最新更新