将超出范围的int转换为char。失去精确度真的是一个问号吗?

时间:2012-11-04 17:45:02

标签: java casting char

我的头脑卡在SCJP 6学习指南中,对于他们在这里提出的观点感到困惑。

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

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

结果是:

d = ? c = ?

这里我很困惑的一点是,在两种情况下,得到的char值都只是一个问号。我本来期望一个荒谬的数值,可能与原始值几乎没有任何关系,但仍然是数字。

为什么结果是问号?我不明白问号在这里是如何“精确度损失”的?

我在SO上看了很多与char有关的问题,并且搜索了很多,但是找不到答案。

它与其他JVM有什么不同?或者它是对所有超出范围的char演员的标准回应?

4 个答案:

答案 0 :(得分:3)

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

System.out.println("d = " + ((int) d) + " c = " + ((int) c));

答案 1 :(得分:3)

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

答案 2 :(得分:1)

字符实际上是ff9e1170,它们应该显示为

enter image description here enter image description here

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

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

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

答案 3 :(得分:0)

System.out.println((char)65);

打印出来

  

A

因此,使用损失精度进行的转换不是问号,它是在应用转换后使其成为char的值的char表示。