0

为什么输出在以下两个代码中都不同,因为我正在应用相同的显式类型转换。

    int hex = (char)0xA;
    System.out.println(hex);

    int hex = 0xA;
    System.out.println((char)hex);
4

2 回答 2

2

在第一行,您向函数发送一个intprintln。在您发送 char价值的那一刻,因此差异..

考虑System.out.println(char x)的以下重载 和 : System.out.println(int x)的重载

于 2012-10-07T14:36:00.263 回答
0

正如@Mortalus 回答的那样,差异的原因是因为在一种情况下您将int 传递给println,在另一种情况下您传递了一个char。

我只是想补充一点,我可以看到,在第一种情况下,您试图创建一个 char 而不是 int 但是语法不正确。代替:

int hex = (char)0xA;

采用

char hex = 0xA;

在上面的第一个语句中,文字 0xA 是十进制值 10 的 int 文字。然后显式转换为值 10 的 char。最后将 char 分配给 int 变量 hex。由于 10 对 int 和 char 都有效,因此执行隐式转换,将 char 转换回 int,最终得到一个 int 变量,而不是 char 变量。

在上面的第二个语句中,我们有相同的文字值并将其分配给一个字符。执行隐式转换,您有一个值为 10 的 char 变量 hex。

如果您对示例进行相应的更改,您将看到它们现在都打印出相同的结果。

char hex = 0xA;
System.out.println(hex);

int hex = 0xA;
System.out.println((char)hex);

[更新]

在每种情况下,这都会打印出值为 10 的字符 - 几乎每个系统都将其解释为换行符,然后是系统定义的行分隔符序列(因为 println 保证它将在输出中添加行分隔符)。

请注意,在 Windows 上,行通常由 CR LF(13 后跟 10)分隔,而在 Linux/Mac 系统上,行通常由 LF(10)分隔。

因此,在 Windows 上,这两个语句都会产生 3 个字节(10、13、10)。在 Linux/Mac 上,这两个语句都会产生两个字节 (10, 10)。

无论哪种方式,输出看起来都像几个空行。它在 Linux/Mac 上看起来不错 - 但在 Windows 上可能看起来很奇怪,因为您发送的行分隔符无效。

顺便说一句 - 我实际上并不推荐上面的代码来生成换行符。相反,您应该使用系统属性 line.separator 并改用该字符串。

String newLine = System.getProperty("line.separator").toString();
于 2012-10-07T17:02:15.650 回答