Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在将超出范围的int转换为char。精度的损失真的是个问号吗?_Java_Casting_Char - Fatal编程技术网

Java 正在将超出范围的int转换为char。精度的损失真的是个问号吗?

Java 正在将超出范围的int转换为char。精度的损失真的是个问号吗?,java,casting,char,Java,Casting,Char,我的脑袋被SCJP 6学习指南卡住了,对他们在这里提出的一点感到困惑 关于向chars强制输入,他们说以下内容是完全合法的,但会导致精度损失(我完全理解): 其结果是: d = ? c = ? 这里我感到困惑的一点是,在这两种情况下,结果char值都只是一个问号。我本来希望得到一个无意义的数值,可能与原始值几乎没有关系或根本没有关系,但仍然是数值 为什么结果是个问号?我不明白为什么一个问号就是“精度损失” 我已经看过很多与字符相关的问题,也在谷歌上搜索了很多,但找不到答案 它与其他JVM不同吗

我的脑袋被SCJP 6学习指南卡住了,对他们在这里提出的一点感到困惑

关于向chars强制输入,他们说以下内容是完全合法的,但会导致精度损失(我完全理解):

其结果是:

d = ? c = ?
这里我感到困惑的一点是,在这两种情况下,结果char值都只是一个问号。我本来希望得到一个无意义的数值,可能与原始值几乎没有关系或根本没有关系,但仍然是数值

为什么结果是个问号?我不明白为什么一个问号就是“精度损失”

我已经看过很多与字符相关的问题,也在谷歌上搜索了很多,但找不到答案


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

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

只是你的系统不能显示它们


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

只是你的系统不能显示它们


当您将字符附加到字符串时,将附加字符(例如“a”),而不是其数值(例如97)。如果您想知道字符的数值是多少,请使用

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

当您将字符附加到字符串时,将附加字符(例如“a”),而不是其数值(例如97)。如果您想知道字符的数值是多少,请使用

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

如果将这些字符转换回int,您将看到它们的值分别为65438和4464。这些对应于Unicode字符U+FF9E半宽片假名浊音标记和U+1170韩国语JUNGSEONG WE。当您将字符打印为字符时,您会得到问号,因为您的系统没有为这些字符提供字形的字体。

如果您将这些字符转换回整数,您将看到它们的值分别为65438和4464。这些对应于Unicode字符U+FF9E半宽片假名浊音标记和U+1170韩国语JUNGSEONG WE。当您将它们打印为字符时,您会得到问号,因为您的系统没有为这些字符提供字形的字体

System.out.println((char)65);
打印出来

A

因此,精度损失的铸造并不是一个问号,而是在应用铸造后使其成为字符的值的字符表示

打印出来

A



因此,丢失精度的强制转换不是问号,而是应用强制转换后将其转换为字符的值的字符表示。

我猜问题在于您尝试此代码的控制台不支持unicode。请在末尾尝试这一行:
System.out.println(“d=“+(int)d+”c=“+(int)c”)啊哈..-是的,这确实给了我一个更像我期望的打印输出。d=65438 c=4464。我在Windows7上使用Eclipse和Java7。我很惊讶,它不支持unicode,但显然不支持,因为您的建议起了很大的作用。太奇怪了…-))我想问题是您尝试此代码的控制台不支持unicode。请在末尾尝试这一行:
System.out.println(“d=“+(int)d+”c=“+(int)c”)啊哈..-是的,这确实给了我一个更像我期望的打印输出。d=65438 c=4464。我在Windows7上使用Eclipse和Java7。我很惊讶,它不支持unicode,但显然不支持,因为您的建议起了很大的作用。太奇怪了…-))我知道我应该发布一个答案而不是评论。非常感谢大家-包括Luiggi.。-)@佩内洛普杜克,不客气。因为您正在学习SCJP6考试,所以最好在Windows和Linux上运行一些Java代码,比较JVM在不同OS.Hmm-fair point中的行为。我想会有相当多微妙(甚至可能不是那么微妙)的差异。再次感谢您的帮助和建议。:-)我知道我应该发布一个答案而不是评论。非常感谢大家-包括Luiggi.。-)@佩内洛普杜克,不客气。因为您正在学习SCJP6考试,所以最好在Windows和Linux上运行一些Java代码,比较JVM在不同OS.Hmm-fair point中的行为。我想会有相当多微妙(甚至可能不是那么微妙)的差异。再次感谢您的帮助和建议。:-)谢谢你的回答,这很有帮助。可悲的是,虽然我是新来的,但我还不能投票赞成-谢谢你的回答,这很有帮助。可悲的是,虽然我是新来的,但我还不能投票赞成-谢谢你的回答,这很有帮助。可悲的是,虽然我是新来的,但我还不能投票赞成-(但是谢谢.:-)佩内洛佩杜克:很高兴这对你很有帮助。谢谢你的回答——这很有帮助。可悲的是,虽然我是新来的,但我还不能投票赞成-(但是谢谢.:-)佩内洛佩杜克:很高兴这对你很有帮助。谢谢你的回答——这很有帮助。可悲的是,虽然我是新来的,但我还不能投票赞成-谢谢你的回答,这很有帮助。可悲的是,虽然我是新来的,但我还不能投票赞成-(但谢谢.)