【问题标题】:Often big numbers become negative通常大数字变成负数
【发布时间】:2013-06-20 16:32:15
【问题描述】:

自从我开始将 eclipse 用于项目 euler 后,我注意到大数字有时会变成看似随机的负数。我想这与传递类型的边界有关。

如果您能向我解释这些负数是如何产生的以及其背后的逻辑是什么,我会很高兴。另外,我怎样才能避免它们(最好不要使用 BigInteger 类)。丹克!=)

【问题讨论】:

  • 我猜“使用 eclipse”的意思是“使用 java”。我希望你知道 eclipse 与你的问题无关
  • Eclipse 只是一个 IDE。这意味着它只是您编辑、编译和运行代码的地方。您可能正在使用 Java 进行编码。
  • 避免取决于您的具体问题。有时你无法避免使用Biginteger,有时你可以。
  • 是的,谢谢。抱歉,我只是不确定这是否会在不同的开发平台之间发生变化
  • 当您在基本类型 intlong 中进行加法、减法或乘法运算时,实际上是分别对 2³² 或 2⁶⁴ 进行模运算。

标签: java biginteger integer-overflow


【解决方案1】:

此图片显示了您正在寻找的内容。在你的情况下,它显然是更大的数字,但原则保持不变。

Java 中的限制示例如下:
整数:-2,147,483,648 到 2,147,483,647。
长:-9,223,372,036,854,775,808 至 9,223,372,036,854,775,807


在图像 0000、0001 等中,显示了数字的二进制表示。

编辑:在项目 euler 中,您通常必须想办法解决拉格雷数字。这些问题设计的数字很大,以至于您无法使用普通的解决问题的方法。但是,如果您发现确实需要使用它们,我建议还是学习 BigInteger。从长远来看,您会发现它很有用,而且并不那么复杂。这是一个包含许多可理解示例的链接: BigInteger Example

【讨论】:

    【解决方案2】:

    在数学中,数字是无限的。但是在计算机中它们不是。每个int-like 类型都有MAX_VALUEintshortlong。例如Integer.MAX_VALUE。当您尝试将数字增加超过此值时,数字变为负数。这样,数字的内部二进制表示就起作用了。

    int i = Integer.MAX_VALUE;
    i++; // i becomes negative. 
    

    【讨论】:

    • 更具体地说,它变成Integer.MIN_VALUE
    • 让我验证一下 - max_value 之后的下一个数字是 -1? (我的意思是 (int)2^31+1 =-1?
    • 不,Integer.MAX_VALUE 之后的下一个值是 Integer.MIN_VALUE,正如 @Boris the Spider 提到的那样
    【解决方案3】:

    这是 2 位整数的 two's complement 表示:(U 表示无符号,S 表示有符号)

     U | bits |  S
    ---------------
     0 |  00  |  0 
     1 |  01  |  1 \ overflow here:
     2 |  10  | -2 /   1 + 1 = -2
     3 |  11  | -1
    

    算术的完成与无符号情况类似,取模 max(U)(在我们的例子中为 4)。

    对于更大的类型,逻辑是相同的。 Java 中的int 是 32 位的。 64 位使用long

    【讨论】:

      【解决方案4】:

      您可能溢出了数据类型的大小,因为最高有效位是符号位。我不认为 Java 有 unsigned 数据类型,所以如果你想保存比 int 更大的数字,你可以尝试使用更大的数据类型,例如 long。如果您仍然溢出long,那么您几乎被BigInteger 卡住了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 2014-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多