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)
我是否遗漏了一些东西,或者这个简单的任务仍然需要外部库?
如果你指的是
(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)
所以l比Long.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.
| 归档时间: |
|
| 查看次数: |
2755 次 |
| 最近记录: |