使用以下代码:
Float a = 1.2;
有一个错误,因为它将十进制值作为double值,而double
是一个比float
更大的数据类型。
现在,它将整数作为默认int
类型。那么,为什么以下代码没有给出任何错误?
Byte b = 20;
答案 0 :(得分:7)
编译器非常聪明,可以确定20(int
值)的位表示可以适合byte
而不会丢失数据。来自Java Language Specification §5.1.3:
从
double
到float
的缩小基元转换由IEEE 754舍入规则(§4.2.4)控制。此转换可能会失去精确度,但也会失去范围,导致非零float
的{{1}}零和有限双的double
无穷大。float
NaN转换为double
NaN,float
无穷大转换为同一个double
无穷大。有符号整数到整数类型T的缩小转换只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关幅度的信息之外数值,这可能导致结果值的符号与输入值的符号不同。
另见this thread。
答案 1 :(得分:1)
通常没有隐式缩小转换 - 常量表达式是唯一的例外,JLS 5.2明确允许它们:
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
*如果变量的类型是byte,short或char,则可以使用缩小的原语转换,并且常量表达式的值可以在变量的类型中表示。
没有提到浮点数允许隐式缩小转换,因此根据一般规则禁止它们。