java多个带负数的两位数问题

mw3dktmi  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(425)

这个问题在这里已经有答案了

为什么我得到-2147483648和-1的乘法,负数,即-2147483648,相反它应该是+2147483648[重复](1个答案)
java是如何处理整数下溢和溢出的?您将如何检查它(12个答案)
在java中,整数是如何在位级别内部表示的(10个答案)
为什么integer.min\u值的负数会给出相同的值[重复](2个答案)
24天前关门。
我最近面临以下问题

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,代码:https://paiza.io/projects/e/17lf_6-glticyubzv3qofg?theme=twilight
但是它是如何按照逻辑工作的,我需要得到2147483648是一个结果,对吗?那我是怎么得到这个负数的?是因为整数范围(integer.min\u值)?如何解决这个问题?

lg40wkob

lg40wkob1#

最大正值 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_VALUE ).

sz81bmfz

sz81bmfz2#

号码2147483648不存在。int的最大值是2147483647,比预期结果小1。乘法导致溢出,将数字“回滚”到最小的负值,并从那里继续计算(换言之:2147483647+1=-2147483648(最小负值))由于结果只比最大值高1,因此不需要执行其他操作,并返回最小int值。
如果要解决此问题,请对变量使用“long”而不是“int”。您还可以使用更复杂的类,如bigdecimal,或者为字节数组编写自定义乘法函数。
注意:无论您使用什么数字类型,只要用于表示数字的内存是有限的,您都可能遇到类似的问题。虽然在正常情况下,这是不可能的,即使是32位整数(int)。

相关问题