Java中的类型转换歧义
我对Java还很陌生。遇到了一个问题,希望对此有更多的了解 以下代码未编译:Java中的类型转换歧义,java,casting,Java,Casting,我对Java还很陌生。遇到了一个问题,希望对此有更多的了解 以下代码未编译: byte a = 10; byte b = 20; byte c = a + b; 编译错误->类型不匹配:无法从int转换为byte 这是一个编译错误,因为: 在Java中,所有整数文本都被视为整数 因此,a+b会产生一个整数文本,在存储到字节类型变量之前需要将其类型转换为字节,因为可能会丢失精度。我完全理解上述概念 让我困惑的是一个与浮点变量类似的概念。以下代码段已成功编译: float d = 1.2; flo
byte a = 10;
byte b = 20;
byte c = a + b;
编译错误->类型不匹配:无法从int转换为byte
这是一个编译错误,因为:
在Java中,所有整数文本都被视为整数
因此,a+b会产生一个整数文本,在存储到字节类型变量之前需要将其类型转换为字节,因为可能会丢失精度。我完全理解上述概念
让我困惑的是一个与浮点变量类似的概念。以下代码段已成功编译:
float d = 1.2;
float e = 2.3;
float f = d + e;
根据Java:
在Java中,所有十进制文字都被视为十进制文字
因此,类似地,(d+e)必须产生一个十进制文本,它将被视为十进制类型,并存储在浮点类型变量中。这里我们也有精度损失。为什么编译器不强迫我们在这里进行显式类型转换呢?为什么这里不是编译错误 在java中,不能将浮点值声明为:
float d = 1.2;
float e = 2.3;
因为编译器推断1.2
和2.3
为双精度。您必须将其转换为浮动:
float d = (float) 1.2;
float e = (float) 2.3;
或
Java中的类型转换歧义
您发布的代码中没有类型转换
以下代码未编译:
byte a = 10;
byte b = 20;
byte c = a + b;
这是一个编译错误,因为:
在Java中,所有整数文本都被视为整数
不,不是。这是一个编译错误,因为小于int
的类型之间的所有操作都会生成int
值:
如果除移位运算符以外的整数运算符至少有一个long类型的操作数,则使用64位精度执行该操作,并且数字运算符的结果为long类型。如果另一个操作数不长,则首先通过数字提升(§5.6)将其加宽(§5.1.5)以键入long
否则,该操作将使用32位精度执行,数值运算符的结果为int类型。如果任一操作数不是int,则首先通过数值提升将其加宽为int类型
如果您声称的Java规则实际上是Java规则,那么这三行代码都无法编译。但是Java中没有您所声称的规则。你刚刚编出来的
因此,a+b产生一个整数文本
不,没有。结果是一个整数值
在存储到字节类型变量之前,需要将其类型转换为字节,因为可能会丢失精度。我完全理解上述概念
不,你根本不明白
让我困惑的是一个与浮点变量类似的概念。以下代码段已成功编译:
float d = 1.2;
float e = 2.3;
float f = d + e;
不,没有。这两行都会产生编译错误:错误:不兼容的类型:可能从double到float的有损转换
float f = d + e;
这是一份汇编
根据Java:
在Java中,所有十进制文字都被视为十进制文字
没有这样的规则。再说一次,这是你编的。Java中没有“十进制文字”或decimal
因此,在类似的注释中(d+e)必须产生十进制文字
否。它会产生一个浮点值
它将被视为十进制类型
Java中没有“十进制类型”。有一个BigDecimal
,它是一个类,不是一个类型,但它与这个问题没有任何关系
并存储在一个浮点型变量中。这里我们也有精度损失
不,我们没有:
如果数值运算符的操作数中至少有一个为double类型,则使用64位浮点运算执行该运算,数值运算符的结果为double类型的值。如果另一个操作数不是double,则首先通过数字提升(§5.1.5)将其加宽为double
否则,使用32位浮点算法执行该运算,数值运算符的结果为float类型的值。(如果另一个操作数不是浮点,则首先通过数字提升将其加宽为类型浮点。)
你写道:
为什么编译器不强迫我们在这里进行显式类型转换呢?为什么这里不是编译错误
因为这不是一个错误。它不是前一个错误的实例,因为它不涉及比int
更窄的类型
不要只是制定规则,然后问为什么Java不遵守规则。检查实际规则。这与文字无关;它是关于+
操作符的byte+byte
给出了int
,但是float+float
给出了float
。看看这个。可能重复。您在引号中引用的“根据Java”规则的可能重复项不存在。你刚刚编的。不要对未引用的文本使用引用格式。
float f = d + e;