Java相当于unsigned long long吗?


106

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

是否可以将无符号长(长)用作Java原语?如何使用?


4
注意从Java 8起,已接受的答案已过时。有关新功能,请参见GigaStore答案,在该功能中您可以要求Java将数字视为未签名。不是日常使用,而是在您需要时方便使用。
罗勒·布尔克

Answers:


55

我不相信 一旦您想做的比有符号的做大,我认为BigInteger是唯一的方法。


17
这个答案有点过时了(发布于2009年)。从Java 8(2014年3月发布)开始,对unsigned long的支持。检查我在下面发布的示例作为答案。
2015年

140

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

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

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

String l1Str = Long.toUnsignedString(l1)

然后

System.out.println(l1Str);

@ j10,Long ul1 = Long.parseUnsignedLong(objScannerInstance.next("\\d+"));不是很优雅,因为它没有范围检查,但是它允许您输入长数字输入,否则可能超出有符号长范围。(利用也Scanner::next(...)可以接受Pattern对象或String模式的事实。)
Spencer D

很难。
Alex78191 '18


7

不,没有。Java的设计师记录在案,表示他们不喜欢unsigned int。请改用BigInteger。有关详细信息,请参见此问题


22
我尊重戈斯林的所作所为,但我认为他对没有未签名的整数的辩护是我听过的最愚蠢的借口之一。:-)在Java中,比起未签名的整数,我们还有更多奇怪的事情... :-)
Brian Knoblauch

1
JavaPolis 2007上的Gosling给出了一个示例,该示例令人困惑地不适用于未签名的int。乔什·布洛赫(Josh Bloch)指出,它也不适用于带符号的整数。任意大小的整数ftw!
汤姆·哈特芬

Brian Knoblauch-是的,它创建了易受攻击的代码实践。请参阅Google已修补的原始文件公开后仅两天,即可看到第二个“主密钥”样式APK漏洞
jww

2
@PP:我认为不可能定义明智的规则,当有符号和无符号类型中至少有一个定义了包装行为时,该规则允许有符号和无符号类型之间进行自由交互。话虽这么说,无符号字节或无符号short会导致麻烦,因为字节无论如何都不会与其他类型进行交互。更大的问题是为用于表示数字的类型定义了包装行为,这与在包装行为实际上有用的情况下为那些罕见的情况(例如哈希码计算)使用单独的包装类型不同。
supercat 2014年

3
@PP .:我希望语言设计者会认识到区分数字和代数环的重要性(“包装整数”类型是什么)。任何大小的数字都应隐式转换为任何大小的戒指,但戒指应仅通过函数或通过显式类型转换将数字转换为相同的大小数字。C的行为(无符号类型通常表现为代数环,但有时表现为数字)可能是所有可能世界中最糟糕的;我不能怪Gosling想要避免这种情况,尽管他采取了完全错误的方法。
supercat 2014年

6

Java 8提供了一组无符号的long操作,使您可以将那些Long变量直接视为unsigned long,这是一些常用的变量:

有符号和无符号long的加法,减法和乘法相同。


2
快速查看源代码可以使我对这些方法保持谨慎。当多头确实为负数时(即与带符号的情况有所不同),将使用BigInteger类。这意味着将最多分配8个新的BigInteger,这很多,而且肯定会导致性能下降。
Toonijn

4

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


4

对于无符号,您可以使用Guava库中的 UnsignedLong类:

它支持各种操作:

  • 减去
  • 除以

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


3

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


15
char是一个无符号的16位值;)
Peter Lawrey,09年

2

org.apache.axis.types包中有一个

UnsignedLong类。

对于行家:

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.