Java中的无符号长整数

时间:2017-06-07 12:55:58

标签: java long-integer biginteger unsigned

目前,我使用的是有符号值,-2 ^ 63到2 ^ 63-1。现在我需要相同的范围(2 * 2 ^ 64),但只有正值。我发现java文档提到了unsigned long,它适合这种用途。

我试图将2 ^ 64声明为Long包装器对象,但它仍然丢失数据,换句话说,它只捕获到Long.MAX_VALUE,所以我显然遗漏了一些东西。 BigInteger是Java支持的签名长吗?

是否有关于如何声明和使用它的定义或指针?

3 个答案:

答案 0 :(得分:6)

Java没有unsigned long类型,但如果你小心,你可以将带符号的64位二进制补码整数(即long)视为无符号。

许多原始整数运算都是"符号不可知&#34 ;;例如你可以使用Java原语加法,减法和乘法,并获得" right"回答使用long表示的无符号数字。

对于除法和比较等其他操作,Long类提供了divideUnsignedcompareUnsigned等方法,可以为表示为long值的无符号数字提供正确的结果。

(这些操作是在Java 8中添加的。在此之前,您可以使用第三方库,例如Guava;例如com.google.common.primitives.UnsignedLongs中的静态方法。)

答案 1 :(得分:4)

在Java 8中,引入了unsigned long支持。尽管如此,这些都是典型的多头,但这个标志并不影响加减。对于分割和比较,您在Long中有专门的方法。此外,您可以执行以下操作:

long l1 = Long.parseUnsignedLong("12345678901234567890");
String l1Str = Long.toUnsignedString(l1)

BigInteger有点不同。它可以保持庞大的数字。它将它们存储为int[]并支持算术运算。

答案 2 :(得分:0)

如果使用第三方库是一个选项,则有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中的值。

(免责声明:我为这些图书馆背后的公司工作)