7
long freeSize = ((Main.maxSPace-Main.usedSpace)*1000*1000);

maxSpace = 20000
usedSpace = 8

-->freeSize = -1482836480

なぜこれがマイナスの結果になるのですか?

4

4 に答える 4

3

maxSpaceおよびusedSpaceint として宣言されているため、すべての演算は int で実行されます。結果を long にキャストする場合にのみ、結果を代入しますが、freeSizeそれ以前にオーバーフローが発生しています。

1000番号を次のように置き換えて1000L、強制がより早く発生するようにしてください。

long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
于 2013-04-08T23:08:50.927 に答える
3

maxSpaceとは整数であるため、おそらく負の数を取得してusedSpaceいます。20000 - 8 = 19992、これは(2 6319992 * 1000000 = 19992000000 - 1)より小さいですが、 (2 31 - 1)より大きいです。これはまだ int の値の範囲外です。あなたはさせて、長くするべきです。Long.MAX_VALUEInteger.MAX_VALUE19992000000 - Integer.MAX_VALUE = 17844516353maxSpaceusedSpace

于 2013-04-08T23:09:54.203 に答える
2

maxSpace と usedSpace が int 型の場合、型オーバーフローのために負の値が返されます。maxSpace と usedSpace の両方の変数に対して、代わりに long を使用してください。または、Main のプロパティ タイプを変更できない場合は、コードを次のように変更できます。

long freeSize = ((Main.maxSPace-Main.usedSpace)*1000L*1000L);
于 2013-04-08T23:08:53.710 に答える