通常,在語句和表示式中使用型別相同的變數和常量。但是,如果使用混合型別,c不會像pascal那樣停在那裡死掉,而是採用一套規則進行自動型別轉換。雖然這很便利,但是有一定的危險性,尤其是在無意間混合使用型別的情況下(許多unix系統都使用lint程式檢查型別「衝突」。如果選擇更高錯誤級別,許多非unix c編譯器也可能會報告型別問題)。最好先了解一些基本的型別轉換規則。
1.當型別轉換出現在表示式中時,無論是 unsigned 還是 signed 的 char 和 short 都會被自動轉換成 int,如有必要會轉換成 unsigned int(如果 short 與 int 的大小相同,unsigned short 就比 int 大,這種情況下,unsigned short 會被轉換成 unsigned int)。在 k&r 那時的 c 中 float 會被自動轉換成 double (目前的c不是這樣)。由於都是從較小型別轉換為較大型別,所以這些轉換被稱為公升級。
2.涉及兩種型別的運算,兩個值都會被分別轉換成兩種型別的更高階級別。
3.型別的級別從高到低依次是 long double、double、float、unsigned long、long long、unsigned long、long、unsigned int、int。例外的情況是,當 long 和 int 的大小相同時,unsigned int 比 long 的級別高。之所以 short 和 char 型別沒有列出,是因為它們已經被公升級到 int 或者 unsigned int。
4.在賦值表示式語句中,計算的最終結果會被轉換成賦值變數的型別。這個過程可能導致型別公升級或降級。所謂降級,是指把一種型別轉換成更低階別的型別。
5.當作為函式引數傳遞時,char 和 short 被轉換成 int,float 被轉換成 double。
型別公升級通常不會有什麼問題,但是型別降級會導致真正的麻煩。原因很簡單:較低型別可能放不下整個數字。例如,乙個8位的 char 型別變數儲存整數101沒有問題,但是存不下22334.
如果帶轉換的值與目標型別不匹配的話,所引起的變化將取決於轉換涉及的型別。待賦值的值與目標型別不匹配時,規則如下:
1.目標型別是物符號整型,且待賦值的值是整數時,額外的位將會被忽略。例如,如果目標型別時8位 unsigned char,待賦的值是原始值求模256。
2.如果目標型別是乙個有符號整數,且待賦的值是整數,結果因實現而異。
3.如果目標型別是乙個整型,且待賦的值是浮點數,該行為是未定義的。
如果把乙個浮點數轉換成整型型別時,等於浮點數型別降級為整型型別,原來的浮點數會被截斷。例如,23.12 和 23.99都會被截成23,而 -23.5則會被截成 -23。
/*程式清單 convert.c --自動型別轉換*/
#include
intmain
(void
)
輸出結果如下:在編者的系統中,char 是8位,int 是32位。程式的分析如下。ch = c, i = 67,fl = 67.00
ch = d, i = 203, fl = 339.00
now ch = s
now ch = p
通常,應該避免自動型別轉換,尤其是型別降級。但是如果能夠小心使用,型別轉換也會很方便。我們前面討論的型別轉換都是自動完成的。然後,有時候需要進行精確的型別轉換,或者在程式中表明型別轉換的意圖。這種情況下要用到強制型別轉換,即在某個量的前面放置用圓括號括起來的型別名,該型別名即是希望轉換成的目標型別。圓括號和它括起來的型別名稱構成了強制型別轉換運算子,其通用形式如下:
( type)用實際需要的型別(如,long)替換 type 即可。
考慮下面兩行**,其中 mice 是 int 型別的變數。第 2 行包括兩次 int 強制型別轉換。
mice =
1.6+
1.7;
mice =
(int
)1.6+(
int)
1.7;
第 1 行使用自動型別轉換。首先,1.6 和 1.7 相加得 3.3 。然後,為了匹配 int 型別的變數,3.3被型別轉換截斷為整數 3.第 2 行,1.6 和 1.7 在相加之前被轉換成整數(1),所以把 1 + 1 的和賦值給變數 mice。本質上,這兩種型別轉換都好不到**去,要考慮程式的具體情況再做取捨。
一般而言,不應該混合使用型別(因此有些語言直接不允許這樣做),但是偶爾這樣做也是有用的。c 語言的原則是避免給程式設計師設定障礙,但是程式設計師必須承擔使用的風險和責任。
以上。
文章摘取於 《c primer plus》第六版 中文版 第五章
C語言中的型別轉換
計算機進行算術運算時,通常要求運算元具有相同的位數 相同的儲存方式。而c語言支援在表示式中混合使用基本資料型別,因此需要在不同的資料型別之間進行轉換。在c語言中存在兩種型別的轉換,一種是隱式轉換,由編譯器自動處理轉換而無需程式開發人員介入,另一種是強制型別轉換 顯式轉換 需要程式開發人員使用強制轉換...
C語言中的型別轉換!
自動轉換發生在不同資料型別運算時,在編譯的時候自動完成 自動轉換遵循的規則就好比小盒子可以放進大盒子裡面一樣,下圖表示了型別自動轉換的規則。縮寫 ascii 英文全稱 american standard code for information interchange 美國資訊交換標準 是一種用於資...
C語言中的型別轉換
c語言中的型別轉換可以分為兩種 隱式轉換中的規則有 窄的向寬的轉變 unsigned 同型別無符號比有符號寬 同型別的轉換例如 int a 10 unsigned int b 10 if a b printf a b else printf a不同型別的轉換例如 int c 10 unsigned ...