簡體   English   中英

Java:為什么“長”數會變為負數?

[英]Java: Why does “long” number get negative?

我有這個代碼:

    long i = 0;
    while (true) {  
        i += 10*i + 5;
        System.out.println(i);
        Thread.sleep(100);      
    }

為什么long i會在幾次打印后變得消極? 如果超出范圍,是否應該發生錯誤?

如果在最大值之后增加一個數字,Java不會拋出錯誤。 如果您希望出現此行為,可以使用Java 8中的Math.addExact(long x, long y)方法。如果傳遞Long.MAX_VALUE則此方法將拋出ArithmeticException

Java沒有拋出異常並且您收到負數的原因與數字的存儲方式有關。 對於長基元,第一個字節用於指示數字的符號(0 - >正,1 - >負),其余用於數值。 這意味着作為最大正值的Long.MAX_VALUE將被存儲為01111 ... 111(0后跟63位為1)。 由於您向Long.MAX_VALUE添加一個數字, Long.MAX_VALUE您將開始接收負整數,因為符號字節更改為1.這意味着您有一個數字溢出,但Java不會拋出此錯誤。

如果操作溢出,結果將返回到最小值並從那里繼續。

沒有異常拋出。

如果您的代碼可能溢出,則可以使用BigInteger

Math javadoc的摘錄:

“該平台使用帶有int和long基本類型的帶符號二進制補碼整數算法。開發人員應選擇基本類型以確保算術運算始終如一地產生正確的結果,這在某些情況下意味着操作不會溢出計算值的范圍最好的做法是選擇原始類型和算法以避免溢出。“

對於Java 8:

“在大小為int或long並且需要檢測溢出錯誤的情況下,方法addExact,subtractExact,multiplyExact和toIntExact在結果溢出時拋出ArithmeticException。對於其他算術運算,例如除法,絕對值,增量,減量,並且只有特定的最小值或最大值才會出現否定溢出,並應根據需要檢查最小值或最大值“

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM