[英]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.