使用以下代码:
Float a = 1.2;这里有一个错误,因为它接受小数作为双精度值,并且double是比float更大的数据类型。
现在,它接受integer作为默认的int类型。那么,为什么下面的代码没有给出任何错误呢?
Byte b = 20;发布于 2015-08-28 01:30:40
编译器足够聪明,能够计算出位表示为20 (一个int值)可以在不丢失数据的情况下适合byte。从Java Language Specification §5.1.3
从
double到float的缩窄基元转换受IEEE754舍入规则(§4.2.4)管理。此转换可能会丢失精度,但也会丢失范围,从而导致非零双精度的float零和有限双精度的float无穷大。将doubleNaN转换为floatNaN,并将double无穷大转换为相同符号的float无穷大。
有符号整数到整数类型T的缩小转换简单地丢弃除n个最低阶位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失关于数值大小的信息之外,这可能导致结果值的符号不同于输入值的符号。
另请参见this thread。
发布于 2015-08-28 01:48:12
一般情况下没有隐式的缩小转换-常量表达式是唯一的例外,JLS 5.2明确允许它们:
此外,如果表达式是字节、短整型、整型字符或整型整型的常量表达式(§15.28):
**如果变量的类型是字节、短整型或字符型,并且常量表达式的值可以在变量的类型中表示,则可以使用缩小基元转换。
没有提到允许对浮点数进行隐式缩小转换,因此根据一般规则,它们是被禁止的。
https://stackoverflow.com/questions/32255812
复制相似问题