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

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

4

3 回答 3

4

令人困惑的结果是由于它char是无符号类型。当-2转换为 时char,其位表示变为1111111111111110二进制,因为使用了二进制补码表示。65534当转换为十进制时,该表示变为正数 -您看到的程序打印的结果

于 2013-07-27T10:26:51.910 回答
0

在 Java 中,char是无符号类型(并且byte是有符号类型)。(char)-2也是如此65534。然后你将其扩展为int.

于 2013-07-27T10:27:00.280 回答
0

您对代码结果的困惑部分是由于符号扩展。我将尝试添加更详细的解释,以帮助您解决困惑。

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。

于 2013-07-27T10:29:24.123 回答