【问题标题】:Why 2*Integer.MAX_VALUE = -2? [duplicate]为什么 2*Integer.MAX_VALUE = -2? [复制]
【发布时间】:2012-10-13 17:23:07
【问题描述】:

可能重复:
How does Java handle integer underflows and overflows and how would you check for it?
How is System.out.println(4*2147483647) equal to -4 in java?

我想知道为什么会这样:

2 * Integer.MAX_VALUE == -2

期待您的回复。

【问题讨论】:

  • 很多反对票。这是一个特别糟糕的问题吗?固定整数算术是奇数(并且应该是晦涩的)。
  • 我没有投反对票,但我认为这是因为它是一个经常被问到的问题(堆栈溢出的几个答案)并且这个问题可能缺乏任何研究。
  • @Scorpion 最好关闭为重复而不是投票。没见过(只看Java标签,可能会解释)。

标签: java


【解决方案1】:

你得到这个结果是因为 integer overflow: 在表示负整数的 two's complement 系统中,取最大值 011.....112 并乘以 2 得到你11.....1102,对应-2

【讨论】:

    【解决方案2】:

    那是因为整数溢出。

    【讨论】:

      【解决方案3】:

      Integer.MAX_VALUE0x7FFFFFFF。乘以 2 得到0xFFFFFFFE(相当于左移一位)。这是一个负数(第一位是1),是-2的二进制表示。

      【讨论】:

        【解决方案4】:

        这是因为二进制补码,其中最左边的位用于表示数字是正数 (0) 还是负数 (1)。因此,当您自己添加 max int(相当于乘以 2)时,会发生这种情况:

          011111111111111111111111
        + 011111111111111111111111
        __________________________
          111111111111111111111110
        

        111111111111111111111110 代表-2。

        【讨论】:

          【解决方案5】:

          Int的MAX_VALUE是2^31 - 1 = 2147483647 = 0111 1111 1111 1111 1111 1111 1111 1111(二进制数)最高位(这里是第一位0,表示整数为正数,当1表示否定的。

          (假设一个整数的长度是 4 个字节),2 * MAX_VALUE,在计算机中,一个整数乘以 2 是在位上左移(运算符

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-07-19
            • 2020-01-23
            • 2012-03-12
            • 1970-01-01
            • 2015-07-26
            • 2022-11-19
            • 1970-01-01
            • 2015-07-23
            相关资源
            最近更新 更多