public class Multicast {
public static void main(String[] args) {
System.out.println((int) (char) (byte) -2);
}
}
我对类型转换感到困惑,也给出了意想不到的结果(它打印65534,而不是预期的-2)。
答案 0 :(得分:4)
令人困惑的结果是char
是无符号类型的事实。当-2
转换为char
时,其位表示将变为二进制1111111111111110
,因为使用了two's complement表示。转换为十进制时,该表示形式为65534
- the result you see printed by your program。
答案 1 :(得分:0)
在Java中,char
is an unsigned type(和byte
是签名类型)。因此(char)-2
是65534
。然后你把它扩大为int
。
答案 2 :(得分:0)
您对代码结果的混淆部分是由于签名扩展。我会尝试添加更详细的解释,这可能有助于您的困惑。
char a = '\uffff';
byte b = (byte)a; // b = 0xFF
这会导致信息丢失。这被视为缩小转换。将char转换为字节“只丢弃除n个最低位之外的所有位”。
结果是:0xFFFF -> 0xFF
char c =(char)b; // c = 0xFFFF
将字节转换为char被视为特殊转换。它实际上执行两次转换。首先,字节是SIGN扩展的(新的高阶位从旧符号位复制)到int(正常的加宽转换)。其次,int转换为具有缩小转换的char。
结果是:0xFF -> 0xFFFFFFFF -> 0xFFFF
int d = (int)c; // d = 0x0000FFFF
将char转换为int被视为扩展转换。当char类型扩展为整数类型时,它是ZERO扩展的(新的高位比特设置为0)。
结果是:0xFFFF -> 0x0000FFFF.
打印时,这将为您提供65535。