Java8无符号算术

Jan*_*ese 5 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++;
}
Run Code Online (Sandbox Code Playgroud)

产生输出

1
2
4
8
...
1152921504606846976
2305843009213693952
4611686018427387904
-9223372036854775808
0
0
0
...
0
Run Code Online (Sandbox Code Playgroud)

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

Sot*_*lis 6

如果你指的是

(Long.compareUnsigned(l, Long.MAX_VALUE*2) < 0)
Run Code Online (Sandbox Code Playgroud)

l 到达

-9223372036854775808
Run Code Online (Sandbox Code Playgroud)

没有签名

9223372036854775808
Run Code Online (Sandbox Code Playgroud)

Long.MAX_VALUE*2
Run Code Online (Sandbox Code Playgroud)

18446744073709551614
Run Code Online (Sandbox Code Playgroud)

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

假设你问的是0

0
0
0
...
0
Run Code Online (Sandbox Code Playgroud)

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

所以

10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

-9223372036854775808
Run Code Online (Sandbox Code Playgroud)

当你这样做

-9223372036854775808 + -9223372036854775808
Run Code Online (Sandbox Code Playgroud)

你从下溢(溢出?)

    10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
+   10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

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