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

したがって、署名されていない世界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です。

于 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 に答える