官术网_书友最值得收藏!

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型。

主站蜘蛛池模板: 大港区| 西丰县| 肇庆市| 华容县| 永宁县| 金湖县| 盐亭县| 大名县| 南通市| 临汾市| 咸宁市| 镶黄旗| 镇江市| 萍乡市| 泰宁县| 太康县| 上饶市| 铅山县| 瑞金市| 潍坊市| 通榆县| 金湖县| 岳普湖县| 玉屏| 泗洪县| 黄陵县| 剑阁县| 常山县| 贡觉县| 新余市| 大竹县| 永吉县| 都匀市| 台安县| 广丰县| 陕西省| 左权县| 常山县| 德兴市| 融水| 色达县|