[英]Unsigned long in Java
目前,我使用的是有符号值,-2^63 到 2^63-1。 现在我需要相同的范围 (2 * 2^64),但只有正值。 我发现 java 文档提到了 unsigned long,它适合这种用途。
我试图将 2^64 声明为 Long 包装器对象,但它仍然丢失数据,换句话说,它只捕获到Long.MAX_VALUE
,所以我显然错过了一些东西。 BigInteger
是 Java 支持的有符号长BigInteger
吗?
是否有关于如何声明和使用它的定义或指针?
在 Java 8 中,引入了unsigned long
支持。 尽管如此,这些都是典型的多头,但符号不影响加法和减法。 对于划分和比较,您在Long
有专门的方法。 此外,您可以执行以下操作:
long l1 = Long.parseUnsignedLong("12345678901234567890");
String l1Str = Long.toUnsignedString(l1)
BigInteger
有点不同。 它可以保留大量数字。 它将它们存储为int[]
并支持算术。
尽管 Java 没有 unsigned long 类型,但如果小心的话,您可以将有符号的 64 位二进制补码整数(即long
值)视为无符号。
许多原始整数运算对于二进制补码表示是符号不可知的。 例如,您可以对表示为long
的无符号数使用 Java 原始加法、减法和乘法,并得到“正确”的答案。
对于其他操作,例如除法和比较, Long
类提供了像divideUnsigned
和compareUnsigned
这样的方法,它们将为表示为long
值的无符号数提供正确的结果。
支持无符号操作的Long
方法是在 Java 8 中添加的。在此之前,您可以使用第 3 方库来实现相同的效果。 例如,Guava UnsignedLongs
类中的静态方法。
BigInteger
是 Java 支持的有符号长BigInteger
吗?
BigInteger
是表示大于Long.MAX_VALUE
整数值的另一种方式。 但是BigInteger
是一个重量级的类。 如果您的数字都在 0 到 2 64 - 1(含)范围内,则没有必要。
如果使用第三方库是一种选择,则有jOOU (来自jOOQ的衍生库),它为 Java 中的无符号整数提供包装器类型。 这与为无符号类型提供原始类型(以及字节码)支持并不完全相同,但对于您的用例来说,它可能仍然足够好。
import static org.joou.Unsigned.*;
// and then...
UByte b = ubyte(1);
UShort s = ushort(1);
UInteger i = uint(1);
ULong l = ulong(1);
所有这些类型都扩展了java.lang.Number
并且可以转换为高阶原始类型和BigInteger
。 在您的情况下,早期版本的 jOOU 只是将 unsigned long 值存储在BigInteger
。 0.9.3 版做了一些很酷的位移来适应普通long
的值。
(免责声明:我为这些图书馆背后的公司工作)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.