为什么输出在十六进制整数到字符转换方面有所不同?

时间:2012-10-07 14:32:50

标签: java

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

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

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

2 个答案:

答案 0 :(得分:2)

在第一行,您向int函数发送println值。 在第二个你发送char值因此差异..

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

的重载

答案 1 :(得分: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变量。

在上面的第二个语句中,我们具有相同的文字值并将其分配给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上可能看起来很奇怪,因为你发送了一个无效的行分隔符。

BTW - 我实际上并不建议使用上面的代码来生成换行符。相反,您应该使用系统属性line.separator并使用该字符串。

String newLine = System.getProperty("line.separator").toString();