Java8添加了对无符号数的额外支持。Java中的数值总是有符号的,例如,让我们来观察Integer
:
int
可表示最多2 ** 32
个数。Java中的数值默认为有符号的,所以最后一个二进制数字表示符号(0为正数,1为负数)。所以从十进制的0开始,最大的有符号正整数为2 ** 31 - 1
。
你可以通过Integer.MAX_VALUE
来访问它:
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MAX_VALUE + 1); // -2147483648
Java8添加了解析无符号整数的支持,让我们看看它如何工作:
long maxUnsignedInt = (1l << 32) - 1;
String string = String.valueOf(maxUnsignedInt);
int unsignedInt = Integer.parseUnsignedInt(string, 10);
String string2 = Integer.toUnsignedString(unsignedInt, 10);
就像你看到的那样,现在可以将最大的无符号数2 ** 32 - 1
解析为整数。而且你也可以将这个数值转换回无符号数的字符串表示。
这在之前不可能使用parseInt
完成,就像这个例子展示的那样:
try {
Integer.parseInt(string, 10);
}
catch (NumberFormatException e) {
System.err.println("could not parse signed int of " + maxUnsignedInt);
}
这个数值不可解析为有符号整数,因为它超出了最大范围2 ** 31 - 1
。