一、當出如今表達式裏時,有符號和無符號的char和short類型都將被自動轉換爲int,在須要的狀況下,將自動被轉換爲unsigned int。在K&RC下,但不是在當前的C下,folat將被自動轉換爲double.由於是轉換成較大的類型,因此這些轉換被稱爲提高。函數
二、在包含兩種數據類型的任何運算裏,兩個值都被轉換成兩種類型裏較高的級別。code
三、類型從高到低的順序是:long double、double、float、unsigned long long、long long、unsigned long、long、unsigned int 、int。一個多是例外是當long和int具備相同的大小時,此時unsigned int比long的級別更高。之因此short和char類型沒有出如今此清單裏,是由於他們已經被提高爲int或也可能被提高爲unsigned int。io
四、在賦值語句裏,計算的最後結果將被轉換成將要被賦於值的那個變動的類型。ast
五、當被做爲函數的參數傳遞時,char和short會被轉換爲int,folat會被轉換爲double。class
提高一般是一個平滑的無損害的過程,可是降級可能致使真正的問題。緣由很簡單,一個較低級別的類型可能不夠大,不能存放一個完整的數。變量
程序清單5.14 convert.cobject
/*convert.c --自動類型轉換*/ #include <stdio.h> int main () { char ch ; int i; float fl; fl = i = ch = 'C'; /*9 */ printf("ch = %c, i = %d, fl = %2.2f\n",ch,i,fl); /*10*/ ch = ch+1; /*11*/ i=fl + 2*ch; /*12*/ fl= 2.0*ch + i; /*13*/ printf("ch = %c, i = %d,fl = %2.2f\n",ch ,i ,fl); /*14*/ ch=5212205.17; printf("Now ch = %c\n",ch); return 0 ; }
下面是在8位char,32位int的系統上運行程序的過程分析:數據類型
9和10:字符‘C‘被做爲1字節的ASCII值存儲在ch裏。整數變量i接受由’C‘轉換成的整數,即67,它以4字節存儲。最後,fl接受由67轉換成的浮點數,即67.00.float
11和14行:字符變量’C‘被轉換成整數67,而後把該整數加1.結果的4字節整數68被截爲1字節並存儲在ch裏。當使用%c說明符進行打印時,68被解釋爲’D‘的ASCII碼。程序
12和14行:爲了和2相乘,ch的值被轉換爲一個4字節的整數68.乘積整數136爲了和fl相加而被轉換爲浮點類型。結果203.00f被轉換成int類型並存儲在i中。
13和14:爲了和2.0相乘,ch的值('D',即68)被轉換爲浮點類型。爲了作加法,i值(203)被轉換爲浮點類型。結果(339.00)被存儲在fl中。
15和16:在這裏,示例程序嘗試了一個降級。把ch設置爲一個很大的數。在截去高位後,ch最終變成了連字符這一字符 的ASCII碼。
指派運算符
到目前爲止咱們討論的類型轉換是自動完成的。然而,您也可能須要 準確的類型,或者須要在程序中代表您是知道您正在作類型轉換的。完成這一任務的方法被稱爲指派(cast),其步驟是在某個量的前面放置用圓括號括起來的被但願轉換成的類型名。圓括號和類型名一塊兒構成了指派運算符。其通常形式以下:(type)