Java 中的无符号长

2022-09-01 14:11:06

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

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

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


答案 1

在 Java 8 中,引入了未签名的支持。不过,这些都是典型的多头,但符号不会影响加减。为了进行除法和比较,您在 中有专用的方法。此外,您还可以执行以下操作:longLong

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

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


答案 2

尽管 Java 没有无符号长类型,但您可以处理有符号的 64 位二进制补码整数(即 值) 作为无符号,如果您对此很小心。long

许多基元整数运算对于二的补码表示是符号不可知的。例如,您可以对表示为 的无符号数字使用 Java 基元加法、减法和乘法,并获得“正确”的答案。long

对于其他操作(如除法和比较),该类提供类似的方法,该方法将为表示为值的无符号数字提供正确的结果。LongdivideUnsignedcompareUnsignedlong

支持未签名操作的方法已添加到 Java 8 中。在此之前,您可以使用第三方库来实现相同的效果。例如,Guava UnsignedLongs 类中的静态方法。Long


Java 支持的签名长吗?BigInteger

BigInteger将是表示大于 的整数值的另一种方法。但是是一个重量级。如果您的数字都在 0 到 264 - 1(含)的范围内,则没有必要。Long.MAX_VALUEBigInteger


推荐