簡體   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