System.out.println(1000*16777216/4890);
OUTPUT:-82342
爲什麼「x * y/z」會導致錯誤的負值?
...但應該是:3430923
我怎樣才能解決這個問題?
System.out.println(1000*16777216/4890);
OUTPUT:-82342
爲什麼「x * y/z」會導致錯誤的負值?
...但應該是:3430923
我怎樣才能解決這個問題?
只需將L
添加到1000
或16777216
(或兩者)......並且這樣做就可以實現。
的原因,就像說Rod_Algonquin,它的整數值的積極的溢出,當你通過16777216
乘1000
,它的發生; (最大允許數)Integer.MAX_VALUE
,因此它會從Integer.MIN_VALUE
開始(在您的情況下,值將爲-402653184
;將它除以4890
,您將得到意想不到的結果-82342
)。
看一看(注意黃色突出顯示部分,IDEA會提醒你在表達數值上溢):
可能是正確的,但OP可能不知道爲什麼。 –
感謝您的解釋我認爲可能會有溢出,但我不明白的負面結果 –
正如@Rod_Algonquin指出,1000*16777216
超過int
的range(int
取值在-2 到2 - 1),所以它會導致溢出。
爲了防止溢出情況發生,你可以通過添加字母L
數量文字後,像下面的執行使用long
計算:
1000L * 16777216/4890
默認情況下,1000
是Java中的int
文字,而1000L
是一個long
文字。
首先注意到它是整數算術。無論什麼中間計算將被存儲爲整數。 1000*16777216
將給出16777216000
超出整數範圍。 所以現在系統嘗試runtime.As 16777216000
期間管理過流這個整數>
Integer.MAX_VALUE
現在它移動的負範圍值的處理溢出..
嘗試這樣Integer.MAX_VALUE + 1
會給你-2147483648
.Better的方式來管理這是使用long
原語,或者您可以使用double
作爲浮點值。
這是整數值的正溢出,這是數學使用'long'的結果。 –