目前,我使用的是有符号值,-2 ^ 63到2 ^ 63-1。现在我需要相同的范围(2 * 2 ^ 64),但只有正值。我发现java文档提到了unsigned long,它适合这种用途。
我试图将2 ^ 64声明为Long包装器对象,但它仍然丢失数据,换句话说,它只捕获到Long.MAX_VALUE
,所以我显然遗漏了一些东西。
BigInteger
是Java支持的签名长吗?
是否有关于如何声明和使用它的定义或指针?
答案 0 :(得分:6)
Java没有unsigned long类型,但如果你小心,你可以将带符号的64位二进制补码整数(即long
)视为无符号。
许多原始整数运算都是"符号不可知&#34 ;;例如你可以使用Java原语加法,减法和乘法,并获得" right"回答使用long
表示的无符号数字。
对于除法和比较等其他操作,Long
类提供了divideUnsigned
和compareUnsigned
等方法,可以为表示为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
中的值。
(免责声明:我为这些图书馆背后的公司工作)