为什么不发生整数和双操作数的数字推广?

时间:2014-08-26 08:56:49

标签: java

在我最近的工作中,我遇到了一个问题,即一些操作数的数字推广。以下是演示代码:

int num1 = 9999999;
int num2 = 65536;
double result = num1*num2*1.0;

在我看来,我认为num1和num2都将自动升级为double,然后计算结果,因为其中一个操作数是double,而结果让我感到震惊。我得到一个负数。 然后我查看了JLS,它还说它应该进行数字促销,见下文:

“如果二元运算符的至少一个操作数是浮点类型,则操作是浮点运算,即使另一个是整数运算。

如果数值运算符的至少一个操作数是double类型,则使用64位浮点运算执行运算,并且数值运算符的结果是double类型的值。如果另一个操作数不是double,则首先将其扩展(第5.1.5节)以通过数字提升键入double(第5.6节)。

否则,使用32位浮点运算执行运算,并且数值运算符的结果是float类型的值。 (如果另一个操作数不是浮点数,则首先将其扩展为通过数字提升键入float。)“

如果我将结果更改为1.0 * num1 * num2,它会给我正确的答案。有谁能告诉我这到底是什么。

2 个答案:

答案 0 :(得分:7)

不,num1 * num2的结果会提升为两倍。您的陈述相当于:

double result = (num1 * num2) * 1.0;

通过促销,那将是:

int firstMultiplication = num1 * num2;
double promoted = firstMultiplication;
double result = promoted * 1.0;

基本上,只是是运算符优先级的问题。数字提升发生在操作数上 - 而不是每个表达式都参与评估该操作数开始。

答案 1 :(得分:0)

这与运算符优先级

有关

在你的情况下,发生的是num1和num2是整数,它们首先被计算,它们的结果也是一个整数,因为结果超出了它的范围,因此你得到的结果为负数,下一个step是乘以1.0。在这里,您可以将结果提升为双倍。但现在我们知道它太晚了。

您可以尝试其中任何一种

result=num1*1.0*num2;
result=1.0*num2*num1;
result=1.0*num1*num2;