5

据广泛报道,Java 8 具有对无符号整数的库支持。但是,似乎没有文章解释如何使用它以及有多少是可能的。

像 Integer.CompareUnsigned 之类的一些函数很容易找到,并且似乎可以满足人们的期望。但是,我什至无法编写一个简单的循环来循环 unsigned long 范围内的所有 2 的幂。

int i = 0;
for(long l=1; (Long.compareUnsigned(l, Long.MAX_VALUE*2) < 0) && i<100; l+=l) {
    System.out.println(l);
    i++;
}

产生输出

1
2
4
8
...
1152921504606846976
2305843009213693952
4611686018427387904
-9223372036854775808
0
0
0
...
0

我是否遗漏了什么,或者这个简单的任务仍然需要外部库?

4

2 回答 2

6

如果你指的是

(Long.compareUnsigned(l, Long.MAX_VALUE*2) < 0)

l达到

-9223372036854775808

未签名的是

9223372036854775808

Long.MAX_VALUE*2

18446744073709551614

所以lLong.MAX_VALUE*2未签名的世界要小。

假设你问的是 0

0
0
0
...
0

问题(如果你这么看的话)是,对于long(其他数字基元),第一位是符号位。

所以

10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

-9223372036854775808

当你这样做

-9223372036854775808 + -9223372036854775808

你下溢(溢出?)因为

    10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
+   10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

这是 0。在以后的循环迭代中,0 + 0仍然是0

于 2014-04-07T04:41:31.550 回答
4

这里唯一的问题是您打印l为有符号整数。您可以使用Integer.toUnsignedString来获得您期望的结果:

int i = 0;
byte[] tmp = new byte[9];
for(int l=1; (Long.compareUnsigned(l, Long.MAX_VALUE*2) < 0) && i<100; l+=l) {
    System.out.println(Integer.toUsignedString(l)); // <== MODIFIED THIS LINE
    i++;
}
于 2014-04-07T04:38:57.163 回答