繁体   English   中英

Java向下转换

[英]Java Downcasting Conversion

为什么 char c = 65 有效而不抛出错误但 float d = 65.0 无效并抛出静态错误:分配中的错误类型:从双精度型到浮型? 两个人不都垂头丧气吗?

可以从引用一句JLS 5.2节,并说“这是这样的,因为语言规范是这么说的”,但不会满足不是吗?

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

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

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


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

赋值上下文允许使用以下之一:

...

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

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

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

  • 常量表达式
  • 在目标类型的范围内,所以char x = 100000; 是无效的。
float d = 65.0;

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

你看这里。

float d = 65.0f;

如果你想给 d 给 65 而不必写字母 f,你可以执行以下操作。

float d = (float)65.0;

这被称为窄铸造。

Java 意义上的65.0是双倍的,因为. . 如果你希望这个数字是一个浮点数,只需在它后面添加f

float d = 65.0f

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM