【问题标题】:Java Long.MAX_VALUE property throws "integer number too large" exception! Am including "L" [duplicate]Java Long.MAX_VALUE 属性抛出“整数太大”异常!包括“L”[重复]
【发布时间】:2015-03-09 07:10:24
【问题描述】:

我正在使用 Java SE 开发套件 8 更新 25(64 位)。 我已经阅读了来自The Java™ Tutorials 的“原始数据类型”java 教程,根据这个规范,long 类型可以保持 (2 的 64 次幂)-1 的最大值,即 18446744073709551615。

但是下面的代码会抛出“整数太大”的错误信息。

public class SampleClass
{
    public static void main (String[] args)
    {        
        Long longMaxValue= 18446744073709551615L /* UInt64.MaxValue */;
    }
}

Long.Max_Value 也只返回 9223372036854775807 。为什么?我需要将值 18,446,744,073,709,551,615 作为常量存储在 java 中。我该怎么办?

如有任何帮助,将不胜感激。

【问题讨论】:

  • “代码”下方在哪里?
  • 来自 javadoc :带符号的 long 的最小值为 -2 的 63 次方,最大值为 2 的 63-1 次方。在 Java SE 8 及更高版本中,您可以使用 long 数据类型来表示无符号的 64 位 long,其最小值为 0,最大值为 2 的 64-1 次方
  • 是 aberry,正在使用的值是(2 的 64 次方)-1,相当于 18446744073709551615,我使用的是 java SE 8。那么为什么会出现错误?

标签: java primitive


【解决方案1】:

long 的最大正值是 (2 的 63 次方) - 1,因为 Java 中的 long 是有符号的,因此可以容纳负整数。最左边的位是为符号保留的,它为值本身留下了 63 位。

如果Long.MAX_VALUE 对您来说不够大,您可以使用BigInteger

如果您使用 Java 8 并希望将 long 视为未签名,则另一种选择是使用 Long 的未签名方法:

例如:

long l = parseUnsignedLong("18446744073709551615");

如果您打印lSystem.out.println(l),您将看到一个负值,但如果您打印Long.toUnsignedString(l),您将看到无符号值。

【讨论】:

  • 规范说这(2的63次方)适用于Java SE 8的早期版本。请参考规范指出如下“长数据类型是64位二进制补码整数。有符号的 long 最小值为 -(2 的 63 次幂),最大值为 (2 的 63 次幂)-1。在 Java SE 8 及更高版本中,您可以使用 long 数据类型来表示无符号 64 位长,最小值为 0,最大值为(2 的 64 次幂)-1。"
  • 查看这个答案,基本上是重复的 w.r.t.关于 unsigned int 和 long stackoverflow.com/questions/25556017/… 的相当混乱的(恕我直言)文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
相关资源
最近更新 更多