【问题标题】:Java Downcasting ConversionJava 向下转换
【发布时间】:2020-02-13 19:39:38
【问题描述】:

为什么 char c = 65 工作并且不抛出错误但 float d = 65.0 不工作并抛出静态错误:赋值中的错误类型:从双精度到浮点数?两个人不是很落魄吗?

【问题讨论】:

  • 我不确定,但似乎在第一种情况下没有向下转换,因为有符号字符 65 将在范围内 - 127。在第二种情况下,从 double 向下转换为 float,是的

标签: java types casting


【解决方案1】:

可以引用 JLS section 5.2 中的内容并说“它的工作原理是这样的,因为语言规范是这样说的”,但这不会令人满意吗?

我对为什么设计这样的语言的有根据的猜测:

65 转换为char 时,您真正所做的只是在二进制表示中去掉一堆无关紧要的0,因为char 是16 位,而@ 987654328@ 是 32 位的。这就像把 0065 变成 65。

另一方面,65.0double,并以 floating point 格式表示。请注意,通常,这种表示只是真实值的近似值。请参阅this post 了解更多信息。位数越多,近似值越好。因此,从double(64 位)转换为float(32 位)有点像将 0.333333 转换为 0.333。希望您同意这比将 0065 变为 65 损失的信息更大。因此,这不是应该自动执行的转换。程序员需要意识到这种情况正在发生。


无论如何,为了完整起见,这是语言规范的相关部分:

分配上下文允许使用以下之一:

...

此外,如果表达式是 byteshortcharint 类型的常量表达式(第 15.28 节):

  • 如果变量的类型是 byte、short 或 char,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换。

因此语言规范对 byte、short、char 和 int 进行了特殊处理,允许它们在赋值上下文中进行缩小转换。请注意,表达式必须是:

【讨论】:

  • 正如@Sweeper 所说,int-to-char 的位模式不会改变(如果合适的话);它只是丢了一些零。但是 32 位浮点数的位模式与 64 位浮点数的相同值的位模式完全不同,即使两者都可以准确地表示该值。
  • 哦,这很有意义,基本上你不能像使用 char 到 int 那样将浮点数减少到两倍
  • @NicolasBarone 如果您认为我的回答回答了您的问题,请考虑通过单击该复选标记接受它!
【解决方案2】:
float d = 65.0;

65.0 不是浮点值。 这是一个双重价值。 输入浮点值时,数字必须以字母 f 结尾。

你看这里。

float d = 65.0f;

如果您想将 d 设为 65 而不必写字母 f,您可以执行以下操作。

float d = (float)65.0;

这被称为窄铸造。

【讨论】:

    【解决方案3】:

    65.0 在 Java 意义上是双精度的,因为 .。如果您希望此数字为浮点数,只需在其后面添加f

    float d = 65.0f

    【讨论】:

      猜你喜欢
      • 2017-03-16
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 2017-03-18
      • 2016-02-05
      • 1970-01-01
      • 2013-05-03
      • 2011-05-01
      相关资源
      最近更新 更多