class Test
{
public static void main(String[] args)
{
short s=2,s1=200,s2;
s2=s+s1; // error: "possible loss of precision"
System.out.println(s2);
}
}
爲什麼分配短兩個短的結果會導致編譯錯誤?爲什麼我會在Java中得到關於「可能的精度損失」的警告?
class Test
{
public static void main(String[] args)
{
short s=2,s1=200,s2;
s2=s+s1; // error: "possible loss of precision"
System.out.println(s2);
}
}
爲什麼分配短兩個短的結果會導致編譯錯誤?爲什麼我會在Java中得到關於「可能的精度損失」的警告?
因爲當您分配數字文字時,它默認爲整數。編譯器不檢查該值以檢查精度是否會丟失。
此外,Java將執行整數運算。有關短值的更多信息,請參閱Primitive type 'short' - casting in Java。
在這種情況下可出現上溢,如果32,767 < s + s1
或s+s1 < -32,768
-32,768 - 32,767
爲短變量可能值的範圍。
它是默認的返回類型值爲java中的運算符運算符是int數據類型??? – Bhadri 2011-05-07 06:04:00
沒有「默認」返回類型。你簡單的可能會超出範圍,因爲一個範圍內的兩個隨機數的總和可能大於範圍本身。 – StKiller 2011-05-07 06:06:10
@AndreiPodoprîgora如果我們使用'int'而不是'short',結果不會變成'long'並且需要投射;這種擴展行爲特定於小於'int'的整數類型。當然,溢出仍然是一個有效的問題,但是警告僅僅是關於截斷'int'的危險,而不是可能的溢出。 – 2014-06-25 23:49:42
由於兩個短褲的總和將被評估爲一個整數,因此您將一個整數分配給一個短整數。
就可以解決這個鑄造回短:
s2=(short)(s+s1);
因爲爲了短褲執行算術運算,編譯器將它們首先擴大至整數:
S2 = s + s1
實際上是
S2 = (int)s +(int)s1
其中右側有int類型。
這是由於Java使用int
來計算小整數;加入之後,Java抱怨由於投退而導致精度的損失。
值得注意的幾件事情:
如果總和涉及您是分配給變量,您可以通過使用+=
運營商避免顯式轉換的需要,因爲複合算術/賦值運算符都暗含對原始變量類型的轉換(如果需要的話)。
它不在「short s = 2,s1 = 200,s2;」中錯誤發生的線,它是在總和。 – fbafelipe 2011-05-07 06:05:28
這個答案只是錯誤的。編譯器足夠聰明,可以告訴字面值不會溢出短路,所以初始化是合法的。正如其他人已經指出的那樣,Java算術運算符將整數類型擴展爲int寬度。 Java然後需要一個強制轉換回短寬度。 – 2014-06-25 23:42:13