在我最近的工作中,我遇到了一个问题,即一些操作数的数字推广。以下是演示代码:
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,它会给我正确的答案。有谁能告诉我这到底是什么。
答案 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;