一个比Long.MAX_VALUE还要大的长整型数

62

如何获取比Long.MAX_VALUE更大的长整型数?

我希望此方法返回true

boolean isBiggerThanMaxLong(long val) {
    return (val > Long.MAX_VALUE);
}
6个回答

101

该方法无法返回true。这就是Long.MAX_VALUE意义所在。如果其名称为false,那将会非常令人困惑。然后它应该只被称为Long.SOME_FAIRLY_LARGE_VALUE并且完全没有合理的用途。只需使用Android的isUserAGoat,或者您可以编写一个始终返回false的自定义函数。

请注意,内存中的long占用固定数量的字节。来自Oracle的介绍

long:长整型数据类型是一个64位带符号的二进制补码整数。它的最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807(包括两个端点)。当需要比int提供的范围更广的值范围时,请使用此数据类型。

正如你从基础计算机科学或离散数学中所知道的一样,由于它是64位,因此long有2^64种可能的值。并且正如你从离散数学或数字理论或常识中所知道的,如果只有有限的可能性,则其中之一必须是最大的。这就是Long.MAX_VALUE。因此,你正在询问类似于“是否存在一个大于0且小于1的整数?” 这在数学上是无意义的。

如果您确实需要这个真实用途,请使用BigInteger类。


8
应该有人致力于打破isUserAGoat API,可以通过发明传送技术或者至少为山羊创建一个安卓小工具来实现。 - Mr.Me
@gongshw 假设 triangle.lborderA 是一个 long,那么你可以删除那个检查。我不会感到惊讶如果它被优化掉了。 - djechlin
测试用的源代码包含判断语句"triangle.lborderA > 0 && triangle.lborderA <= Long.MAX_VALUE"。因此,似乎我无法使我的单元测试达到100%的覆盖率。 - gongshw
2
@gongshw 尝试使用 lborderA < 0 来使该检查失败。同样,您不能使一个检查失败,它说 if(Boolean.TRUE) - djechlin
1
@Mr.Me 嗯,根据这个答案,如果你下载了com.coffeestainstudios.goatsimulator包,那么山羊的传送就可以开始了! - MC Emperor
在这里,您可以获得有关数据类型的良好解释:https://xenovation.com/blog/development/java/what-is-a-data-type-in-java - cilap

14

无法做到。如果您有一个名为isBiggerThanMaxLong(long)的方法,它应该始终返回false

如果您要增加Long.MAX_VALUE的位数,则下一个值应该是Long.MIN_VALUE。请阅读二进制补码的相关知识,这将告诉您原因。


6
首先,以下方法无法编译,因为它缺少返回类型,应该使用Long.MAX_VALUE代替Long.Max_value
public static boolean isBiggerThanMaxLong(long value) {
      return value > Long.Max_value;
}

上面的方法永远不会返回true,因为您正在将一个long值与Long.MAX_VALUE进行比较,查看方法签名,您只能传递long。任何long都可以像Long.MAX_VALUE一样大,但不能超过它。
您可以尝试使用BigInteger类来实现类似以下的操作:
public static boolean isBiggerThanMaxLong(BigInteger l){
    return l.compareTo(BigInteger.valueOf(Long.MAX_VALUE))==1?true:false;
}

下面的代码将返回true
BigInteger big3 = BigInteger.valueOf(Long.MAX_VALUE).
                  add(BigInteger.valueOf(Long.MAX_VALUE));
System.out.println(isBiggerThanMaxLong(big3)); // prints true

4
如果triangle.lborderA确实是一个长整型,则原始代码中的测试非常简单,无法进行测试。这也是无用的。
然而,如果triangle.lborderA是一个双精度浮点数,比较就是有用的且可以进行测试。isBiggerThanMaxLong(1e300)将返回true。
  public static boolean isBiggerThanMaxLong(double in){
    return in > Long.MAX_VALUE;
  }

1
isBiggerThanMaxLong(Long.MAX_VALUE + 1.0)会返回false。isBiggerThanMaxLong(Long.MAX_VALUE + 1024.0)也会返回false。当使用doubles >= Long.MAX_VALUE + 1025.0时,您将获得true。 - Samil
@Samil 确实。对于任何大于Long.MAX_VALUE的双精度数,它都会返回true,其中有很多这样的数。由于浮点舍入,Long.MAX_VALUE+1.0不是其中之一。 - Patricia Shanahan

1

只需记住BigInteger是一个类,而long是一个原始类型。如果您想比较大于long_max_value的大值,则将您的值包装在BigInteger类中,并将它们视为对象。


0
一个比long的最大值还要大的“long”并不存在,我建议您使用BigInteger类,并将long的最大值转换为BigInteger。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接