public class Multicast {
public static void main(String[] args) {
System.out.println((int) (char) (byte) -2);
}
}
我很困惑的類型轉換,並給出意想不到的結果(它打印65534,而不是預期的-2)。混淆在類型轉換和給出意想不到的結果
public class Multicast {
public static void main(String[] args) {
System.out.println((int) (char) (byte) -2);
}
}
我很困惑的類型轉換,並給出意想不到的結果(它打印65534,而不是預期的-2)。混淆在類型轉換和給出意想不到的結果
令人困惑的結果是由於char
是一個無符號類型。當-2
轉換爲char
時,由於使用two's complement表示法,因此它的位表示將變成二進制的1111111111111110
。當轉換爲十進制時,該表示成爲正數65534
- the result you see printed by your program。
在Java中,char
is an unsigned type(和byte
是簽名類型)。所以(char)-2
是65534
。然後你將其擴大爲int
。
您對代碼結果的困惑部分是由於簽名擴展。我會嘗試添加更詳細的解釋,以幫助您解決困惑。
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.
你想達到什麼目的? –
定義_unexpected result_的含義。 – BackSlash