Java8无符号算术

时间:2014-04-07 04:33:55

标签: java java-8 integer-arithmetic

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

Integer.CompareUnsigned等一些函数很容易找到并且似乎可以达到预期的效果。但是,我甚至无法编写一个简单的循环,它循环遍历无符号长整数范围内的所有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

我是否遗漏了这个简单任务仍需要的东西或外部库?

2 个答案:

答案 0 :(得分:6)

如果您指的是

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

l到达

-9223372036854775808

无符号它是

9223372036854775808

Long.MAX_VALUE*2

18446744073709551614

因此l小于无符号世界中的Long.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

答案 1 :(得分: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++;
}