在类型转换中混淆并给出意想不到的结果

时间:2013-07-27 10:22:29

标签: java

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

我对类型转换感到困惑,也给出了意想不到的结果(它打印65534,而不是预期的-2)。

3 个答案:

答案 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)-265534。然后你把它扩大为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。