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时,为什么不是呢给出任何错误。。。