Java类型转换混淆

3
拿这两个片段来举例:
案例1:
Scanner s = new Scanner(System.in);
int n = s.nextInt(); /** take user input **/

n *= Double.NEGATIVE_INFINITY;

and

Case 2:

int k=10;
double kk = 10.10;

int rst = k*kk;

在这两种情况下,我并没有进行任何类型转换,但是 Case 1 能够正确执行并打印出n的值,而 Case 2 会抛出一个错误:无法从double转换为int。为什么会有这种差异呢?


因为*=(以及+=和类似的运算符)是在左侧参数的类型中计算的。然而*会将参数提升到“最宽”参数的类型。 - Hot Licks
2
因为 n *= Double.NEGATIVE_INFINITY 等同于 n = (int)(n * Double.NEGATIVE_INFINITY) - johnchen902
3
请访问https://dev59.com/BGoy5IYBdhLWcg3wMLSj?rq=1。 - exception1
@exception1:你的链接解决了我的疑问...谢谢!!! :) - NoobEditor
投票关闭,作为用户@exception给出的线程的重复。 - NoobEditor
3个回答

5
第一个有效,而第二个无效,是因为*= += -=等操作符会自动转换类型
例如,如果您将第二个示例更改为;
int k=10;
double kk = 10.10;
k*= kk;

应该可以正常工作。或者你可以像这样添加一个显式转换:rst = (int)(k*kk);


1
Java中的算术提升是指在对两个数据类型不同的变量进行算术运算时发生的情况。在这种情况下,编译器将二进制算术操作中的一个操作数的数据类型转换为另一个操作数的数据类型。
在您的情况下,将int和double相乘时,int被提升为double,并且结果为double。因此,它不能存储在int中。
详见: http://www.codemiles.com/java/arithmetic-promotion-t3487.html#sthash.sdHtt7pG.dpuf

0
在Java中,整数(int)和浮点数相乘的结果将始终为浮点数(double)。您正在将此结果分配给需要转换的整数rst

case 1中不是也发生了同样的事情吗?乘法值被重新赋值给int了吗? - NoobEditor
@NoobEditor - 是的,非常正确。 - Rudi Kershaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接