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

Storing result of multiplication of two integers in 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) 工作正常,但是,当我尝试 (32329,4746475) 作为输入时,代码不起作用,它显示 0 作为答案。 我在不同的地方放置了一些输出语句进行调试,发现使用这个输入,乘法的结果是 -1170032381(这是错误的),因此 while 循环的条件失败。所以,我像这样对 A 和 B 进行了类型转换

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

瞧,它成功了。现在,我的问题是为什么? 为什么代码对于较小的输入工作正常而对于较大的输入失败并且 'int to long' 不应该是 Java 中的隐式类型转换?

(我还尝试了一些其他输入,所以并非所有较大的输入都给出负值作为乘积,但它们也没有给出正确答案,较小的我已经尝试过直到 5 位数字 A 和 B 给出正确答案产品)

Java 从 int 自动扩大到 long,但这发生在 assignment,但是 [=10] 的乘法=] 和另一个 int 产生一个 int,所以你会得到 integer overflow first 32329 乘以 4746475然后 将溢出的 int 结果扩展为 long.

但是,如果您 首先int 中的至少一个转换为 long,则使用 long 和结果是 long,所以没有整数溢出。

Java int 可以存储来自

-2147483648 to 2147483647

32329 X 4746475 =153448790275

因为Java在隐式转换之前做乘法结果是错误的