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
,其位表示变为1111111111111110
二进制,因为使用了二进制补码表示。65534
当转换为十进制时,该表示变为正数 -您看到的程序打印的结果。
在 Java 中,char
是无符号类型(并且byte
是有符号类型)。(char)-2
也是如此65534
。然后你将其扩展为int
.
您对代码结果的困惑部分是由于符号扩展。我将尝试添加更详细的解释,以帮助您解决困惑。
char a = '\uffff';
byte b = (byte)a; // b = 0xFF
这确实会导致信息丢失。这被认为是缩小转换。将 char 转换为字节“只会丢弃除 n 个最低位之外的所有位”。结果是:0xFFFF -> 0xFF
字符 c = (字符)b; // c = 0xFFFF
将字节转换为字符被认为是一种特殊的转换。它实际上执行了两次转换。首先,字节被 SIGN 扩展(新的高位从旧的符号位复制)到一个 int(一个正常的加宽转换)。其次,将 int 转换为具有缩小转换的 char。结果是:0xFF -> 0xFFFFFFFF -> 0xFFFF
int d = (int)c; // d = 0x0000FFFF
将 char 转换为 int 被视为扩大转换。当 char 类型扩展为整数类型时,它是零扩展的(新的高位设置为 0)。结果是:0xFFFF -> 0x0000FFFF.
打印时,这将为您提供 65535。