java向下转换

hwazgwia  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(319)

为什么char c=65起作用而不抛出错误,而float d=65.0起作用而抛出静态错误:赋值中的错误类型:从double到float?他们不是都很悲观吗?

gblwokeq

gblwokeq1#

我可以引用jls第5.2节中的一些内容,并说“它是这样工作的,因为语言规范这么说的”,但这并不能令人满意,不是吗?
我有根据的猜测,为什么设计这样的语言:
转换时 65char ,您真正要做的只是剥离二进制表示中的一堆无关紧要的0,因为 char 是16位,而 int 是32位。就像从0065到65岁。
另一方面, 65.0 是一个 double 以浮点格式表示。请注意,通常情况下,此表示仅为真值的近似值。有关更多信息,请参阅此帖子。位数越多,逼近效果越好。所以从 double (64位)到 float (32位)类似于将0.333333转换为0.333。希望你会同意,这是一个更大的信息损失比把0065年到65年。因此,这不是应该自动执行的转换。程序员需要意识到这正在发生。
无论如何,为了完整起见,这里是语言规范的相关部分:
分配上下文允许使用以下内容之一:
...
另外,如果表达式是常量表达式(§15.28)类型 byte , short , char ,或 int :
如果变量的类型是byte、short或char,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换。
因此,语言规范对byte、short、char和int进行了特殊处理,允许它们在赋值上下文中进行缩小转换。请注意,表达式必须是:
恒量表达式
在目标类型的范围内,所以 char x = 100000; 无效。

7cwmlq89

7cwmlq892#

float d = 65.0;

65.0不是浮点值。它是一个双倍值。输入浮点值时,数字必须以字母f结尾。
你看这里。

float d = 65.0f;

如果你想在不写字母f的情况下把d给65,你可以这样做。

float d = (float)65.0;

这被称为窄铸件。

42fyovps

42fyovps3#

65.0 在java意义上是双重的,因为 . . 如果你想让这个数字成为一个浮点数,只要加上 f 背后。 float d = 65.0f

相关问题