例如,爲什麼在unsigned short
和int
之間的操作結果始終產生一個int
?數據類型之間的隱式轉換
unsigned short s = 65535;
int i = 65535
表達typeid(s * i * i).name()
,給出的值是出int
的範圍內,但仍是隱式轉換返回int
,爲什麼呢?
例如,爲什麼在unsigned short
和int
之間的操作結果始終產生一個int
?數據類型之間的隱式轉換
unsigned short s = 65535;
int i = 65535
表達typeid(s * i * i).name()
,給出的值是出int
的範圍內,但仍是隱式轉換返回int
,爲什麼呢?
有一組轉換的呼叫,這些之前大部分算術運算符評估中使用的usual arithmetic conversions。
基本上,你可以考慮那裏是對整數算術一些規則:
首先,整數運算都不會與操作數int
「小於」進行的,所以在short * signed char
,兩者的情況下的short
和signed char
操作數被晉升爲int
,兩個int
值相乘,然後將結果是一個int
。其次,如果其中一個或兩個類型都「大於」int
,編譯器會選擇一個至少與最大操作數類型「一樣大」的類型。所以,如果你有long * int
,在int
被提升爲long
,結果是long
。
第三,如果操作數是unsigned
,則結果是無符號的。所以,如果你有long * unsigned int
的long
和unsigned int
都提升到unsigned long
,其結果是unsigned long
。
如果操作數已浮點型,則執行浮點運算:float
,double
,或long double
被使用(哪一個取決於所述類型的操作數;用於確定結果類型的全表可以在本答案開頭的鏈接頁面找到)。
請注意,結果類型不取決於操作數的值。編譯器在編譯時必須選擇類型,然後才能知道這些值。
如果s * i * i
結果出來的結果類型(int
,在您的方案)的範圍內,那麼你的運氣了:你的程序在運行時不能決定,「哦,我應該切換到使用一個long
!「因爲結果類型必須在編譯時選擇。
謝謝,很高興回答。 – user3234 2011-03-15 22:22:24