2010-08-07 51 views
3

我對這個問題的規則感到困惑[一個好的URL可能會節省回答的時間]。我注意到很多時間轉換隱含地起作用,但有時候它是必需的。根據標準,什麼樣的類型轉換顯式冗餘?

例如我曾預計它的工作:

long long a; 
int b; 
[..] 
a = b * 1000; 

但事實證明,「A」溢出,它需要

a = (long long) b * 1000; 

,由於「一」是「大單」我預想的特別之處它會打擾。

無論如何,除了這個例子,你知道關於這個問題的全面信息來源嗎?沒有'大部分時間都可以',這讓我偏執狂。

編輯:這是否只是'第二部分是否先計算並溢出,緊隨其後的規則'?

EDIT2:如果是

long long a; 
int b; 
short c; 
[..] 
c = b + a * 3; 

這樣的計算,會做

c = b + (int) a * 3; 

確保適當的轉換?

或那就需要

c = (short) b + (int) a * 3; 

,或者這將是足以

c = (short) b + a * 3; 

回答

6

類型轉換工作一步一步來。你的表達可以在b * 1000被視爲

a = (b * 1000); 

,編譯器(讓我們假裝這是愚蠢的)不知道你要它存儲到一個long long。由於b和1000都是int s,因此結果也是int。這裏a有多大並不重要。

您可以通過製作1000 a long long來避免演員陣容。

a = b * 1000LL; 

編輯:爲了您的編輯2:

  • along longbint3int
  • 因此,a * 3long long
  • 因此,b + a*3long long
  • 但不需要在c = b+a*3鑄造,作爲算術操作數是隱式轉換爲彼此。
+0

那麼,它確實知道你打算將它存儲很長時間,但它認爲你需要int算數來計算將存儲在那裏的結果。 – 2010-08-07 08:26:56

+0

所以通過製作1000個LL就好像在說'嘿,計算中的那兩個數字中的一個是LL,不要做任何愚蠢的事情並且溢出到一個整數中,做一個LL的計算'。這很簡單嗎? – 2010-08-07 08:27:59