【问题标题】:Java Multiple Two numbers issue with negative numbers [duplicate]Java多个两个负数问题[重复]
【发布时间】:2023-03-05 10:23:02
【问题描述】:

我最近遇到以下问题

 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_VALUE)? 如何解决这个问题?

【问题讨论】:

  • 这个数字对于 int 来说太大了。请改用 long。
  • 修复很简单,长期使用。解释是找出 2s 补码和表示以及如何检测溢出。请参阅 Java 中的 Math.exact > 8

标签: java numbers integer


【解决方案1】:

号码 2147483648 不存在。 int 的最大值是 2147483647,比您的预期结果小 1。乘法会导致溢出,它将数字“回滚”到最小的负值,并从那里继续计算。 (换句话说:2147483647+1=-2147483648(最小的负数))由于结果只会比最大值高1,因此不需要额外的操作并返回最小的int值。

如果您想解决此问题,请对变量使用“long”而不是“int”。您还可以使用更复杂的类,如 BigDecimal,或为字节数组编写自定义乘法函数。

注意:无论您使用哪种数字类型,只要用于表示数字的内存是有限的,您就会遇到类似的问题。虽然在正常情况下不太可能,即使是 32 位整数 (int)。

【讨论】:

  • 号码存在。它只是不能保存在有符号的 int 中。
  • 我的意思是它对于指定的类型不存在。 Java 不支持无符号值,即便如此,与负值相乘的概念也会很有趣。
【解决方案2】:

int 可以保持的最大正值是2147483647,超过该值会到达另一端(即从负端开始)。你可以通过下面的demo来理解:

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)开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2021-06-30
    • 2011-09-10
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多