【发布时间】:2014-10-22 17:48:15
【问题描述】:
在 Oracle “原始数据类型”page 中,它提到 Java 8 增加了对无符号整数和长整数的支持:
int:默认情况下,int数据类型为 32 位有符号二进制补码整数,最小值为 -231,最大值为 231-1。 在Java SE 8及以后的版本中,可以使用int数据类型来表示一个无符号的32位整数,最小值为0,最大值为232- 1. 使用Integer类将int数据类型用作无符号整数。有关更多信息,请参阅数字类部分。compareUnsigned、divideUnsigned等静态方法已添加到Integer类中,以支持无符号整数的算术运算。
long:long数据类型是 64 位二进制补码整数。签名的long的最小值为-263,最大值为263-1。 在 Java SE 8 及更高版本中,您可以使用long数据类型来表示无符号的 64 位long,其最小值为 0,最大值为 264−1. 当您需要比 int 提供的值范围更广的值时,请使用此数据类型。Long类还包含compareUnsigned、divideUnsigned等方法,以支持无符号long的算术运算。
但是,我找不到声明无符号长整数或整数的方法。例如,以下代码给出了“文字超出范围”的编译器错误消息(当然,我使用的是 Java 8),而它应该在范围内(分配的值恰好是 264 -1):
public class Foo {
static long values = 18446744073709551615L;
public static void main(String[] args){
System.out.println(values);
}
}
那么,有没有办法声明一个 unsigned int 或 long?
【问题讨论】:
-
Java 8 中的 Long.MAX_VALUE 常量返回什么?
-
没有无符号整数或无符号长类型。如果您使用其中一种新方法,该方法会将 32 位或 64 位整数视为无符号数。但仅此而已。变量的类型仍然是有符号的,你要记住你将它用作无符号数。他们没有添加无符号文字,但如果有足够多的人对它们进行错误处理,他们可能会将它们添加到 Java 9 中。 :)
-
除了添加新方法之外,他们并没有真正改变任何东西。
-
据我所知,他们所做的只是添加可以返回无符号值的方法,但不允许您声明无符号值。如果你问我有点傻,而且真的很痛苦。我想知道是否一种方法是使用 Integer.divideUnsigned,其中一个参数为 1,另一个是您想要视为无符号的任何数字。据我所知,会起作用,但似乎是一种非常愚蠢的做事方式。
-
@ajb 我怎样才能在“窃听”过程中提供任何帮助以最终在 Java 中看到正确的未签名? :)