Java类型转换混乱
以这两个代码段为例: 案例1:Java类型转换混乱,java,casting,Java,Casting,以这两个代码段为例: 案例1: Scanner s = new Scanner(System.in); int n = s.nextInt(); /** take user input **/ n *= Double.NEGATIVE_INFINITY; int k=10; double kk = 10.10; int rst = k*kk; 及 案例2: Scanner s = new Scanner(System.in); int n = s.nextInt(); /** take
Scanner s = new Scanner(System.in);
int n = s.nextInt(); /** take user input **/
n *= Double.NEGATIVE_INFINITY;
int k=10;
double kk = 10.10;
int rst = k*kk;
及
案例2:
Scanner s = new Scanner(System.in);
int n = s.nextInt(); /** take user input **/
n *= Double.NEGATIVE_INFINITY;
int k=10;
double kk = 10.10;
int rst = k*kk;
在这两种情况下,我没有从我这边进行任何类型转换,但案例1正确执行并打印
n
的值,但案例2抛出错误,无法从double转换为int
。为什么会有这种差异?在java中,整数(int
)与浮点相乘的结果总是会产生浮点(double
)。您正在将此结果分配给需要强制转换的整数rst
。第一个有效,第二个无效,因为*=
+=
-=
等添加自动强制转换
例如,如果您将第二个示例更改为
int k=10;
double kk = 10.10;
k*= kk;
它应该会起作用。或者,您可以只添加显式强制转换,如sorst=(int)(k*kk)代码>
Java中的算术提升在应用算术时发生
对具有不同数据类型的两个变量的操作。在这种情况下
编译器将转换二进制中一个操作数的数据类型
对另一个操作数的类型进行算术运算
在您的例子中,要将int和double相乘,int将提升为double,结果是double。所以,它不能存储到int中
更多信息请参见:,因为*=
(和+=
及其亲属)是在左参数的类型中计算的。但是,*
将参数“升级”为“最宽”参数的类型。因为n*=Double.NEGATIVE_INFINITY
是n=(int)(n*Double.NEGATIVE_INFINITY)
请参见@exception1:您的链接几乎解决了我的疑问…谢谢!!!:)投票关闭用户@exception给出的线程副本在案例1
中不也会发生同样的事情吗???乘法值被分配回int
??@NoobEditor-是的,非常正确。