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

jas*_*son 1 java

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

int num1 = 9999999;
int num2 = 65536;
double result = num1*num2*1.0;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

如果我将结果更改为1.0*num1*num2,它将给我正确的答案.有人能告诉我这到底是什么意思吗?

Jon*_*eet 7

不,结果num1 * num2被提升为双倍.您的陈述相当于:

double result = (num1 * num2) * 1.0;
Run Code Online (Sandbox Code Playgroud)

所以通过促销,那将是:

int firstMultiplication = num1 * num2;
double promoted = firstMultiplication;
double result = promoted * 1.0;
Run Code Online (Sandbox Code Playgroud)

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