同一句語句或表示式如果使用了多種型別的變數和常量(型別混用),c 會自動把它們轉換成同一種型別。以下是自動型別轉換的基本規則:
1. 在表示式中,char 和 short 型別的值,無論有符號還是無符號,都會自動轉換成 int 或者 unsigned int(如果 short 的大小和 int 一樣,unsigned short 的表示範圍就大於 int,在這種情況下,unsigned short 被轉換成 unsigned int)。因為它們被轉換成表示範圍更大的型別,故而把這種轉換稱為「公升級(promotion)」。
2. 按照從高到低的順序給各種資料型別分等級,依次為:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。這裡有乙個小小的例外,如果 long 和 int 大小相同,則 unsigned int 的等級應位於 long 之上。char 和 short 並沒有出現於這個等級列表,是因為它們應該已經被公升級成了 int 或者 unsigned int。
3. 在任何涉及兩種資料型別的操作中,它們之間等級較低的型別會被轉換成等級較高的型別。
4. 在賦值語句中,= 右邊的值在賦予 = 左邊的變數之前,首先要將右邊的值的資料型別轉換成左邊變數的型別。也就是說,左邊變數是什麼資料型別,右邊的值就要轉換成什麼資料型別的值。這個過程可 能導致右邊的值的型別公升級,也可能導致其型別降級(demotion)。所謂「降級」,是指等級較高的型別被轉換成等級較低的型別。(左運算元結果溢位另考慮!!!一般此時也應該加強制型別轉換!c和指標p80)【但不包括指標型別哦】
int main()
5. 作為引數傳遞給函式時,char 和 short 會被轉換成 int,float 會被轉換成 double。使用函式原型可以避免這種自動公升級。 C的「型別提公升」
寫在前面 本來因為乙個朋友問我為什麼可以給unsigned int 賦值負數,我打算寫一篇關於解釋 unsigned 多寶平台 char short int 或者int型 位段 無論signed 或unsigned 以及列舉型別 可以使用在需要 int或者 unsigned int 的表示式中。如果...
表示式型別自動提公升
變數在表示式中進行運算時,也可能發生自動型別轉換,這就是表示式型別自動提公升。在運算期間,變數會自動提公升,而不是轉換之後的結果進行提公升再向左賦值。因為在自動轉換過程中byte會轉換成int,當int強制轉換成byte時會不會損失精度,所以才會取b1的值為127,因為byte的取值範圍為 128 ...
方法過載之引數型別的自動提公升
方法過載會根據方法引數的不同而去匹配,對於基本型別資料存在自動型別提公升的情況。public static void main string args 基本資料型別 public static void test byte a public static void test short a publ...