- C程序設計語言
- 魏東平 朱連章 于廣斌編著
- 1482字
- 2018-12-29 14:37:36
2.9 數值型數據間的混合運算
整型、單精度型、雙精度型數據可以進行混合運算。由于字符型數據與整型數據通用,因此,整型、實型(包括單、雙精度)、字符型數據之間可以進行混合運算。由于參與混合運算的各數據的類型不同,因此,在運算時需要進行類型轉換。
在C語言中,共有兩種類型轉換:第一種是自動類型轉換,即在運算時不必由用戶指定,系統自動進行類型轉換;第二種是強制類型轉換,即使用強制類型轉換運算符來實現強制類型轉換,一般用于自動類型轉換不能達到目的的情況。
1.自動類型轉換
例如,4/2.1+34%3+'x'-11.1234*'a'是合法的。在進行運算時,不同類型的數據要由系統按照由低到高的次序進行類型轉換,其轉換規則如圖2.11所示。

圖2.11 數據類型轉換規則
圖2.11中橫向向左的箭頭表示必定的轉換。例如,只要是字符型或短整型數據參與運算必定先轉換成int型數據,float型數據在運算時為提高運算精度一律轉換成double型數據。
圖2.11中縱向向上的箭頭表示不同類型的數據轉換時的方向。例如,一個int型數據和一個double型數據進行運算時,要先將int型數據直接轉換成double型數據,然后再在兩個同類型(double)數據之間進行運算,結果為double型數據。注意,在這里,int型數據是直接轉換成double型數據的。千萬不要理解成int型先轉換為unsigned型,再轉換成long型,最后才轉換為double型。又如,一個int型數據和一個long型數據進行運算時,也是先將int型數據直接轉換成long型數據再進行計算。
在進行數據類型的混合運算時,需要注意:
① 當字符型數據轉換成整型時,其ASCII碼值在128~255之間的字符(最高位為1)會轉換成負數。
② 當按照short→int→long的順序進行類型轉換時,其符號和數值都能夠正確轉換。當按照相反的順序進行類型轉換時,如果原數值不超出轉換后較低類型的數值范圍,一般也能正確轉換;如果超出較低類型所能表示的數值范圍,則會出現轉換錯誤。
③ 由float型到int型轉換時,會截去小數部分,如果數值超過int型的范圍,一般會出錯。
④ 由整數到實數轉換時,如果該整數不能被精確轉換(如long型轉換為float型時),可能會喪失一些精度。
⑤ 由double型到float型轉換時,當數值大小不超過float型的范圍時,可能會喪失一些精度,但轉換結果基本正確。
⑥ 如果參與混合運算的數據中有float型的,其結果一定是double型的,因為在運算時float型會先轉換為double型再進行計算。
例如,假設已經聲明i為int型變量,f為float型變量,d為double型變量,L為long型變量,c為char型變量,則混合運算i*f-d/L的運算順序如下:
① 進行i*f的運算,先將i和f都轉換成double型再相乘,運算結果為double型;
② 進行d/L的運算,先將L轉換成double型再相除,運算結果為double型;
③ 將第①步的結果與第②步的結果相減,運算結果為double型。
又如,假設c為char型變量,則混合運算10+'a'-c的運算順序如下:
① 進行10+'a'的運算:先將'a'轉換成整數97,再進行10+97,得到整型結果107;
② 將第①步的結果與c(注意:先將c轉換成int型)相減,運算結果為int型。
2.強制類型轉換
例如,假設x已經聲明為float型,則“x%3”是不合法的,必須使用如下形式:(int)x%3。其中,(int)x就是強制類型轉換,將x的值由float型轉換成為int型。
強制類型轉換的一般形式為:
(數據類型名)(表達式)
注意,表達式應該用括號括起來,若是單個變量,則可以省略括號。例如:
● (int)(x*13.45/12)表示將x*13.45/12的運算結果轉換成int型。
● (double)d表示將d的值轉換成double型,d本身的類型不變。
● (float)(10%5)表示將10%5的運算結果轉換成float型。
● (int)(x+y)表示將x+y的運算結果轉換成int型。
● (int)x+y表示將x的值轉換成int型,再與y相加,注意與上式的區別。
需要指出的是,在進行強制類型轉換時,只是得到了一個所需類型的中間變量,原變量或表達式的類型并沒有改變。例如,假設d已經聲明為float型,則“(int)d”進行強制類型運算后得到一個int型的中間變量,它的值等于d的整數部分,而d的類型未變,仍然是float型。