2013-07-27 19 views
-2
public class Multicast { 
    public static void main(String[] args) { 
     System.out.println((int) (char) (byte) -2); 
    } 
} 

我很困惑的類型轉換,並給出意想不到的結果(它打印65534,而不是預期的-2)。混淆在類型轉換和給出意想不到的結果

+1

你想達到什麼目的? –

+2

定義_unexpected result_的含義。 – BackSlash

回答

0

在Java中,char is an unsigned type(和byte是簽名類型)。所以(char)-265534。然後你將其擴大爲int

0

您對代碼結果的困惑部分是由於簽名擴展。我會嘗試添加更詳細的解釋,以幫助您解決困惑。

char a = '\uffff'; 
byte b = (byte)a; // b = 0xFF 

這樣做會導致信息丟失。這被認爲是縮小轉換。將char轉換爲一個字節「只是丟棄n個最低位的所有位」。 結果是:0xFFFF -> 0xFF

char c =(char)b; // c = 0xFFFF

將字節轉換爲字符被視爲特殊轉換。它實際上執行TWO轉換。首先,字節是SIGN-extended(新的高位從舊符號位複製)到一個int(一個正常的加寬轉換)。其次,int被轉換爲具有縮小轉換的字符。 結果是:0xFF -> 0xFFFFFFFF -> 0xFFFF

int d = (int)c; // d = 0x0000FFFF 

轉換一個字符爲int被認爲是一個擴大轉換。當char類型被擴展爲整型時,它被零擴展(新的高位被設置爲0)。 結果是:0xFFFF -> 0x0000FFFF.打印時,這會給你65535.

相關問題