繁体   English   中英

为什么整数和双操作数的数字提升不会发生?

[英]Why the numeric promotion of integer and double operands not happen?

在最近的工作中,我遇到了一个问题,该问题涉及某些操作数的数字提升。 以下是演示代码:

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

在我看来,我认为num1和num2都将自动提升为double值,然后计算结果为其中一个操作数为double值,而结果令我震惊。 我得到一个负数。 然后我查看JLS,它还说应该进行数字提升,请参见下文:

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

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

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

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

不,将num1 * num2的结果提升为两倍。 您的陈述等同于:

double result = (num1 * num2) * 1.0;

因此,通过促销,将是:

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

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

这与运算符优先级有关,

在您的情况下,发生的情况是num1和num2是整数,它们是首先计算的,它们的结果也是一个整数,因为结果超出范围,它被环绕,因此您得到的结果是负数,下一步是乘法与1.0。 如您所料,这里的结果将提高一倍。 但是现在我们意识到,为时已晚。

您可以尝试任何一种

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM