2011-03-15 54 views
6

例如,爲什麼在unsigned shortint之間的操作結果始終產生一個int數據類型之間的隱式轉換

unsigned short s = 65535; 
int i = 65535 

表達typeid(s * i * i).name(),給出的值是出int的範圍內,但仍是隱式轉換返回int,爲什麼呢?

回答

12

有一組轉換的呼叫,這些之前大部分算術運算符評估中使用的usual arithmetic conversions

基本上,你可以考慮那裏是對整數算術一些規則:

  • 首先,整數運算都不會與操作數int「小於」進行的,所以在short * signed char,兩者的情況下的shortsigned char操作數被晉升爲int,兩個int值相乘,然後將結果是一個int。其次,如果其中一個或兩個類型都「大於」int,編譯器會選擇一個至少與最大操作數類型「一樣大」的類型。所以,如果你有long * int,在int被提升爲long,結果是long

  • 第三,如果操作數是unsigned,則結果是無符號的。所以,如果你有long * unsigned intlongunsigned int都提升到unsigned long,其結果是unsigned long

如果操作數已浮點型,則執行浮點運算:floatdouble,或long double被使用(哪一個取決於所述類型的操作數;用於確定結果類型的全表可以在本答案開頭的鏈接頁面找到)。

請注意,結果類型不取決於操作數的值。編譯器在編譯時必須選擇類型,然後才能知道這些值。

如果s * i * i結果出來的結果類型(int,在您的方案)的範圍內,那麼你的運氣了:你的程序在運行時不能決定,「哦,我應該切換到使用一個long!「因爲結果類型必須在編譯時選擇。

+0

謝謝,很高興回答。 – user3234 2011-03-15 22:22:24