Java隐式转换
使用以下代码:Java隐式转换,java,jakarta-ee,implicit-conversion,Java,Jakarta Ee,Implicit Conversion,使用以下代码: Float a = 1.2; 有一个错误,因为它将十进制作为双精度值,double是比float更大的数据类型 现在,它将整数作为默认的int类型。那么,为什么下面的代码没有给出任何错误呢 Byte b = 20; 编译器足够聪明,可以计算出20的位表示(一个int值)可以放入字节中,而不会丢失数据。从: 从double到float的缩小原语转换受IEEE 754舍入规则的约束()。这种转换可能会丢失精度,但也会丢失范围,从而导致非零双精度的float0和有限双精度的floa
Float a = 1.2;
有一个错误,因为它将十进制作为双精度值,double
是比float
更大的数据类型
现在,它将整数作为默认的int
类型。那么,为什么下面的代码没有给出任何错误呢
Byte b = 20;
编译器足够聪明,可以计算出20的位表示(一个
int
值)可以放入字节中,而不会丢失数据。从:
从double
到float
的缩小原语转换受IEEE 754舍入规则的约束()。这种转换可能会丢失精度,但也会丢失范围,从而导致非零双精度的float
0和有限双精度的float
无穷大。double
NaN被转换为float
NaN,而double
无穷大被转换为相同的有符号float
无穷大
有符号整数到整数类型T的缩小转换只会丢弃n个最低阶位以外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关数值大小的信息外,这可能导致结果值的符号与输入值的符号不同
另请参见。通常没有隐式缩小转换-常量表达式是唯一的例外,JLS 5.2明确允许它们:
此外,如果表达式是byte、short、char或int类型的常量表达式(§15.28):
*如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换
没有提到允许对浮点数进行隐式缩小转换,因此根据一般规则,它们是被禁止的 200的位表示也适合字节的8位,而不会丢失数据。重要的是,相同的数值可以在目标类型中表示。@Joni-嗯,是和否。因为byte
值在Java中有符号,“fit-in”实际上是指“fit-in 7位”,而不是8位。200的位模式为1100 1000
。将其放入8位字节值时,它表示值-56,而不是值200。这是因为200的表示溢出到字节的符号位中。关于相同值的表示,您完全正确。+1用于引用规范中指定为什么float
/double
与byte
/int
行为不同的部分。(除了缩小范围之外,OP的具体示例中还有信息丢失,因为1.2不能用浮点表示。但是,即使值是1.0或其他可以用浮点表示的值,编译器也会抱怨)我不知道你们为什么不理解我的问题……你们说编译器足够聪明,可以把20放在字节中……那个么为什么编译器不把1.2放在浮点中……我的简单问题是……我读到在java中,所有十进制都被视为双精度,而默认情况下所有整数都被视为int……那个么,当我给一个字节分配20时,为什么不是呢给出任何错误。。。