1

我的头被 SCJP 6 学习指南困住了,对他们在这里提出的观点感到困惑。

关于将整数转换为字符,他们说以下内容是完全合法的,但是您会失去精度(我完全可以理解):

    char d = (char)-98;
    char c = (char)70000;
    System.out.println("d = " + d + " c = " + c);

结果是:

d = ? c = ?

我感到困惑的一点是,在这两种情况下,生成的 char 值都只是作为问号打印出来。我本来期望一个无意义的数值,可能与原始值几乎没有关系或根本没有关系,但仍然是数字的。

为什么结果是问号?我不明白这里的“精度损失”只是一个问号吗?

我在 SO 上查看了许多与 char 相关的问题,也搜索了很多,但找不到答案。

它与其他JVM不同吗?或者它是对所有超出范围的字符转换的标准响应?

4

4 回答 4

3

当您将 char 附加到 String 时,附加的是 char(例如 'a'),而不是其数值(例如 97)。如果您想知道 char 的数值是什么,请使用

System.out.println("d = " + ((int) d) + " c = " + ((int) c));
于 2012-11-04T17:50:55.697 回答
3

如果将这些字符转换回整数,您会看到它们的值分别为 65438 和 4464。这些对应于 Unicode 字符 U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK 和 U+1170 HANGUL JUNGSEONG WE。将它们打印为字符时会出现问号,因为您的系统只是没有为这些字符提供字形的字体。

于 2012-11-04T17:51:19.143 回答
1

字符实际上是ff9eand 1170,它们应该看起来是

在此处输入图像描述 在此处输入图像描述

只是您的系统无法显示它们。

http://www.fileformat.info/info/unicode/char/ff9e/index.htm

http://www.fileformat.info/info/unicode/char/1170/index.htm

于 2012-11-04T17:50:11.550 回答
0
System.out.println((char)65);

打印出来

一个

因此,具有损失精度的转换不是问号,而是在应用转换后将其转换为 char 的值的 char 表示。

于 2012-11-04T17:51:37.650 回答