5

ここで、signed_int の最大値は 2,147,483,647、つまり 2^31 で、1 ビットは符号ビットなので、

私が走るときlong a = 2,147,483,647 + 1;

それはa = -2,147,483,648答えとして与えます..これは良いです。しかし、24*60*60*1000*1000 = 86400000000(実際には)... Java では、 ..整数のオーバーフロー24*60*60*1000*1000 it equals to 500654080が原因であることは理解していますが、どのような処理でこの値が得られたのか、どのようなロジックを使用してJavaでその数値を取得したのか. こちらも参考にしました

4

6 に答える 6

4

乗算はこのように左から右に実行されます

    int x = 24 * 60;    
    x = x * 60;     
    x = x * 1000; 
    x = x * 1000;

最初の 3 つの操作で 86400000 が生成されますが、これは Integer.MAX_VALUE に収まります。しかし、最後の操作では、16 進数で 0x141dd76000 である 86400000000 が生成されます。4 バイトを超えるバイトは切り捨てられ、0x1dd76000 が得られます。印刷すれば

System.out.println(0x1dd76000);

結果は

500654080
于 2013-07-02T09:32:18.823 に答える
1

int の範囲は-2,147,483,648 から 2,147,483,647 です。したがって、数値を追加し続けて最大制限を超えると、サイクルとして機能するため、左端の数値、つまり-2,147,483,648からゲインが開始されます。あなたの質問ですでに言及したこと。

同様に、24*60*60*1000*1000を計算すると、数学に従って 86400000000になります。

しかし、実際に何が起こるかは、どういうわけか次のとおりです。

86400000000は2147483647+2147483647+2147483647+2147483647+..36 回 +5006540 ​​80と書くことができます

したがって、214748364740 回追加すると0になり、5006540 ​​80が残り、最終的には5006540​​80になります。

私はあなたにそれが明確であることを願っています。

于 2013-07-02T09:54:24.640 に答える
0

整数は 32 ビット長です。簡単にするために、たとえば 4 ビット長の数値を考えてみましょう。

正の最大値は次のようになります。

0111 = 7 (first bit is for sign; 0 means positive, 1 means negative)
0000 = 0

負の最小値は次のようになります。

1111 = -8 (first bit is for sign)
1000 = -1

fbitここで、このタイプをと呼ぶfbit_maxと、7 に等しくなります。

fbit_max + 1 = -8
because bitwise 0111 + 1 = 1111

したがって、fbit_mintoの範囲fbit_maxは 16 です。-8 から 7 までです。

のようなものを掛けて7*10に格納するとfbit、結果は次のようになります。

fbit number = 7 * 10 (actually 70)
fbit number = 7 (to get to from zero to max) + 16 (min to max) + 16 (min to max) + 16 (min to max) + 15 (the rest)
fbit number = 6
于 2013-07-02T09:27:29.007 に答える
0
24*60*60*1000*1000 = 86400000000

MOD を次のように使用します: 86400000000 % 2147483648 = 5006540​​80

于 2013-07-02T09:35:06.403 に答える
0

乗算に L を追加します。L を追加すると、オーバーフローする整数範囲で、それ以外の場合はロング範囲で乗算されます。このように掛けてみてください。

24L*60*60*1000*1000

これで正しい答えが得られます。

于 2013-07-02T09:18:28.360 に答える