【问题标题】:Explanation about a result结果说明
【发布时间】:2019-12-10 03:52:01
【问题描述】:

嗨,我对一些代码有一点问题,我无法解释我的结果。

//what happens?
public static void what() {
    int number = 2147483647;
    System.out.println(number + 33);
}

//Here is my solution for the probleme
public static void what() {
    long number = 2147483647;
    System.out.println(number + 33);
}

以 int 数字作为变量的第一个代码给了我-2147483616 作为结果。因此,当我将 int 更改为 long 时,我得到了预期的好结果。所以问题是谁能帮我解释为什么 int number + 33 = -2147483616

【问题讨论】:

  • 你已经超过了原始数据类型int的最大容量...
  • @deHaar,是的,我知道 int 介于 -2 147 483 648 和 2 147 483 647 之间。仅仅说我超出了限制就足够了吗?
  • 您不能将更大的数字打包到int 类型的变量中,如果这样做,您将得到一个int,它从可能的最低值开始向上计数,然后是负数。您可以检查一个数字是否大于最大值。
  • 我认为只说超出限制是不够的,因为这并不能解释我们获得的具体结果

标签: java int long-integer


【解决方案1】:

Java 整数基于 32 位。第一位保留符号(+ = 0 / - = 1)。

所以2147483647 等于01111111 11111111 11111111 11111111

添加更多会强制值变为负数,因为第一位变成了 1。

10000000 00000000 00000000 00000000 等于 -2147483648

您要添加到 -2147483648 的剩余 32 个将您带到 -2147483616 的结果。

【讨论】:

  • 感谢您的回答和投票。我觉得这个答案简单明了
【解决方案2】:

原始 int 类型的最大值为 2147483647,这是您设置的 number 值。当将任何内容添加到此值时,int 类型无法正确表示它并“回绕”,成为负数。

long 类型的最大值是 9223372036854775807,所以第二个代码 sn-p 工作正常,因为 long 可以毫无问题地保存该值。

【讨论】:

    【解决方案3】:

    您已达到原始类型 int (2147483647) 的最大值。 如果 int 溢出,它会回到最小值(-2147483648)并从那里继续。

    【讨论】:

      【解决方案4】:

      考虑第二个sn-p的计算,以及结果的实际含义。

      long number = 2147483647;
      number += 33;
      

      十进制的结果是 2147483680,十六进制的结果是 0x80000020(更容易显示值的含义)。

      对于第一个sn-p,十六进制的结果也是 0x80000020,因为int类型的算术结果是“完整”结果的低32位。不同的是解释:作为int,0x80000020设置了最高位,最高位的“权重”为-231,所以这个结果被解释为-231 + 32(负数)。作为long,第32位只是一个普通位,权重为231,结果被解释为231 + 32。

      【讨论】:

        【解决方案5】:

        原始类型 int 是一个 32 位整数,只能存储从 -2^312^31 - 1long 是一个 64 位整数,因此它显然可以存储更大的值。

        当我们计算int的容量时,它从-2147483648变为2147483647

        现在你想知道..为什么当数量超过限制并且我添加33时,它会变成-2147483616

        这是因为超出限制后数据排序“重置”。

        因此,2147483647 + 1 将导致 -2147483648。从这里,您可以看到 -2147483648 + 32 将导致您的示例中的值是 -2147483616

        以下一些额外信息:

        除非您真的需要使用大于 int 容量的数字,否则请始终使用 int,因为它占用的内存空间更少。

        另外,如果您的数字大于 long,请考虑使用 BigInteger

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2017-04-30
          • 1970-01-01
          • 2015-01-14
          • 2021-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-26
          • 2020-09-03
          相关资源
          最近更新 更多