有人可以解釋爲什麼下面這段代碼無法編譯。錯誤是:「Possible loss of precision.
」:編譯錯誤:鑄造
byte a = 50;
byte b = 40;
byte sum = (byte)a + b;
System.out.println(sum);
謝謝。
有人可以解釋爲什麼下面這段代碼無法編譯。錯誤是:「Possible loss of precision.
」:編譯錯誤:鑄造
byte a = 50;
byte b = 40;
byte sum = (byte)a + b;
System.out.println(sum);
謝謝。
您通過識別鑄造是必需的,但不幸的是你沒有把它應用到合適的表情,由於運營商的優先做得對。
考慮下面的代碼片段:
static void f(char ch) {
System.out.println("f(char)");
}
static void f(int i) {
System.out.println("f(int)");
}
public static void main(String[] args) {
char ch = 'X';
f((char) ch + 1 ); // prints "f(int)"
f((char) (ch + 1)); // prints "f(char)"
}
演員具有更高的優先級比加,這就是爲什麼片斷輸出它做什麼。也就是說,第一個電話相當於f(((char) ch) + 1);
。添加的結果是int
,這就是調用f(int)
重載的原因。
這裏的教訓是,你應該總是使用括號,除非你做了一個非常簡單的演員。通常,考慮使用括號來明確評估順序,即使它們不是必需的。它們導致更好,更易讀的代碼。
使用「int」算術添加字節;因此結果是int,並且必須從int轉換回byte,這會導致截斷的可能性。
因爲兩個字節變量的操作數爲+,所以它們被隱式提升爲int。這被稱爲數字促銷。因爲int大於字節,並且a + b的結果產生int,所以轉換爲字節可能會刪除一些位,因爲int大於字節。因此,
文件隱數值提升「的精度損失」:
http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#170983
文件的類型大小:
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/datatypes.html
請注意,鑄鐵具有更高的優先級比+運營商。您的代碼做到這一點:
byte a = 50;
byte b = 40;
byte sum = ((byte)a) + b;
System.out.println(sum);
演員是多餘的,因爲a
已經是一個byte
。你大概意思是:
byte a = 50;
byte b = 40;
byte sum = (byte) (a + b);
System.out.println(sum);
+1:這是關鍵部分;演員沒有被應用於提問者可能認爲是的東西。 – 2010-05-03 08:17:58
從我的角度來看,這有點愚蠢。編程語言不應該關心這種錯誤。但我現在明白這個問題。謝謝。 – 2010-05-03 07:48:54
我對Java編譯器知之甚少,但在大多數只是警告的C編譯器中。考慮自己是幸運的;) – 2010-05-03 07:50:34