将两个整数相乘的结果存储在 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在隐式转换之前做乘法结果是错误的
我解决了一个编程问题,如果有 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在隐式转换之前做乘法结果是错误的