2010-05-03 90 views
2

有人可以解釋爲什麼下面這段代碼無法編譯。錯誤是:「Possible loss of precision.」:編譯錯誤:鑄造

byte a = 50; 
byte b = 40; 
byte sum = (byte)a + b; 
System.out.println(sum); 

謝謝。

回答

1

您通過識別鑄造是必需的,但不幸的是你沒有把它應用到合適的表情,由於運營商的優先做得對。

考慮下面的代碼片段:

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)重載的原因。

這裏的教訓是,你應該總是使用括號,除非你做了一個非常簡單的演員。通常,考慮使用括號來明確評估順序,即使它們不是必需的。它們導致更好,更易讀的代碼。

1

使用「int」算術添加字節;因此結果是int,並且必須從int轉換回byte,這會導致截斷的可能性。

3

因爲兩個字節變量的操作數爲+,所以它們被隱式提升爲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

+0

從我的角度來看,這有點愚蠢。編程語言不應該關心這種錯誤。但我現在明白這個問題。謝謝。 – 2010-05-03 07:48:54

+0

我對Java編譯器知之甚少,但在大多數只是警告的C編譯器中。考慮自己是幸運的;) – 2010-05-03 07:50:34

4

請注意,鑄鐵具有更高的優先級比+運營商。您的代碼做到這一點:

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

+1:這是關鍵部分;演員沒有被應用於提問者可能認爲是的東西。 – 2010-05-03 08:17:58