2016-07-22 84 views
-1

當我讀caspp時,有一個問題,確定是否可以添加參數沒有overflow.so我寫的後續代碼。「long long = int + int」先計算,然後鍵入轉換?

//sum1 is long long ,so there is no overflow. 
//when sum2 is overflow ,then sum1 != sum2; 
int tadd_ok (int x,int y) 
{ 
long long int sum1 = x + y; 
int sum2 = x + y; 
return sum1 == sum2; 
} 

然而,還有一些問題。 當我假設x = -2147483647,y = -2時,sum1和sum2都等於2147483747(都溢出!)。

我想,對於「long long = int + int」,首先計算,然後鍵入轉換? 那麼這些規則是什麼?

+0

計算表達式,首先,再後來分配。只要所有操作數都是「int」,表達式就會計算爲「int」。在發佈的代碼中,int sum2 = x + y;'相當於'int sum2 =(int)sum1;'。 – dxiv

+4

C和C++標準文檔在典型的升級和轉換中非常明確。你的問題是你的中間和將是一個合適的大小,很可能,但是這種轉換不會被保留,因爲你正在添加兩個'int'類型。你需要施加加法,而不是假設結果會很長。 –

+1

'C'和'C++'作爲單獨的語言。 – sjsam

回答

3

的主要目的在

long long int sum1 = x + y; 

是評估表達式x + y
請注意,;是一個序列點,意味着必須在達到該點時執行表達式的任何副作用。
這裏副作用是表達式的值分配給x + ysum1

ISO/IEC 9899:201x-> 6.3.1.8-> 1條指出:

除非明確另有sstated ,常見的實際類型也是 對應的實際結果類型。
..
否則,整數提升在兩個操作數上執行。然後將 以下規則應用於提升的操作數:
- 如果兩個操作數具有相同類型,則不需要進一步轉換。
- 否則,如果兩個操作數都具有有符號整數類型或兩者都具有無符號整數類型 ,則類型爲較小整數轉換等級的操作數爲 ,轉換爲具有較高等級的操作數的類型。

你希望做的是

long long int sum1 = (long long int)x + y; // Casting x to LL causes y to be auto-converted 
+0

非常感謝你! –