Java多个带负数的两个数字问题
我最近面临以下问题Java多个带负数的两个数字问题,java,numbers,integer,Java,Numbers,Integer,我最近面临以下问题 public class Main { public static void main(String[] args) throws Exception { // Your code here! int i = -2147483648; int j = i * -1; System.out.println("j="+j); } } 结果:-214748364
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
int i = -2147483648;
int j = i * -1;
System.out.println("j="+j);
}
}
结果:-2147483648
带代码的联机IDE:
但是它是如何按照逻辑工作的,我需要得到2147483648,这是一个结果吗?
那我是怎么得到这个负数的?
这是因为整数范围(integer.MIN_值)?
如何解决此问题?号码2147483648不存在。int的最大值为2147483647,比预期结果小1。乘法导致溢出,该溢出将数字“回滚”到最小的负值,并从此处继续计算。(换言之:2147483647+1=-2147483648(最小负数))由于结果仅比最大值高1,因此不需要执行其他操作,并返回最小int值 如果要解决此问题,请对变量使用“long”而不是“int”。您还可以使用更复杂的类,如BigDecimal,或者为字节数组编写自定义乘法函数
注意:无论您使用什么数字类型,只要用于表示数字的内存是有限的,您都可能遇到类似的问题。尽管在正常情况下,这是不可能的,即使是32位整数(int)。一个
int
所能容纳的最大正值是2147483647
,超过该值,该值就会到达另一端(即从负端开始)。您可以从以下演示中了解它:
public class Main {
public static void main(String[] args) {
int i = -2147483648;
int j = i * -1;
System.out.println("j=" + j);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE + 1);
System.out.println(Integer.MIN_VALUE);
// Some more examples for you to understand this concept better
System.out.println(Integer.MAX_VALUE + 2);
System.out.println(Integer.MAX_VALUE + 3);
}
}
输出:
j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646
-2147483648
与-1
相乘后,它变为2147483648
,但int
变量不能容纳这么大的正值;因此,它将从负端开始(即Integer.MIN\u VALUE
)。对于整数来说,该数字太大。请改用long。解决方法很简单,请使用long。解释是找出补码和表示,以及如何检测溢出。请参见Java>8中的Math.exact,数字存在。它不能保存在有符号的int中。我的意思是它对于指定的类型不存在。Java不支持无符号值,即使这样,与负值相乘的概念也会很有趣。