Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多个带负数的两个数字问题_Java_Numbers_Integer - Fatal编程技术网

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不支持无符号值,即使这样,与负值相乘的概念也会很有趣。