115

在 C++ 中,我喜欢访问 64 位无符号整数 viaunsigned long long int或 via uint64_t。现在,我知道,在 Java 中 long 是 64 位。但是,它们已签名。

是否有可用作 Java 原语的 unsigned long (long)?我该如何使用它?

4

10 回答 10

149

从 Java 8 开始,支持 unsigned long(无符号 64 位)。您可以使用它的方式是:

Long l1 = Long.parseUnsignedLong("17916881237904312345");

要打印它,你不能简单地打印 l1,但你必须首先:

String l1Str = Long.toUnsignedString(l1)

然后

System.out.println(l1Str);
于 2014-08-11T17:09:34.213 回答
58

我不相信。一旦你想要比有符号长的更大,我认为BigInteger是唯一的(开箱即用的)方法。

于 2009-02-03T19:52:47.380 回答
12

不,没有。您必须使用原始long数据类型并处理签名问题,或者使用诸如BigInteger.

于 2009-02-03T19:53:19.140 回答
7

不,没有。Java 的设计者公开表示他们不喜欢无符号整数。请改用BigInteger。有关详细信息,请参阅此问题

于 2009-02-03T19:53:04.883 回答
7

Java 8提供了一组 unsigned long 操作,允许您直接将那些 Long 变量视为 unsigned Long,以下是一些常用的:

加法、减法和乘法对于有符号和无符号长整数是相同的。

于 2014-11-17T20:10:27.690 回答
4

根据您打算执行的操作,结果大致相同,有符号或无符号。但是,除非您使用微不足道的操作,否则您最终将使用 BigInteger。

于 2009-02-03T21:30:06.637 回答
4

对于 unsigned long,您可以使用Guava 库中的UnsignedLong类:

它支持各种操作:

  • 模组
  • 除以

目前似乎缺少的是字节移位运算符。如果您需要这些,您可以使用 Java 中的 BigInteger。

于 2014-08-06T11:34:01.723 回答
3

Java 没有无符号类型。如前所述,产生 BigInteger 的开销或使用 JNI 访问本机代码。

于 2009-02-03T20:06:59.380 回答
2

org.apache.axis.types 包有一个

UnsignedLong 类。

对于行家:

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>
于 2014-12-08T11:27:22.003 回答
0

似乎在 Java 8 中,一些方法被添加到 Long 以将旧的 [signed] long 视为无符号。似乎是一种解决方法,但有时可能会有所帮助。

于 2014-06-05T12:28:21.190 回答