自動類型轉換規則圖中縱向向上的箭頭表示當運算對象為不同類型時的轉換方向。轉換按數據長度增加的方向進行,以保證精度不降低。如int型數據和long型數據運算時,先把int型數據轉化成long型數據後再進行運算。
[例39]各類數據混合運算中的自動類型轉換。
假設有如下變量說明:
charch;
inti;
floatx;
doublez;
表達式(ch/i)+(i+x)*(x*z)在執行過程中的類型轉換情況及結果類型各類數據混合運算中的自動類型轉換在賦值運算中,賦值號兩邊的數據類型不同時,賦值號右邊值的數據類型將轉換為左邊變量的類型。如果右邊值的數據類型長度比左邊長,將會丟失一部分數據,這樣會降低精度。丟失的部分按四舍五入向前舍入。
[例310]賦值運算中的自動類型轉換。
voidmain()
{
floatpi=314159;
ints,r=5;
s=pi*r*r;
printf("s=%d\n",s);
}
運行結果:
s=78
程序分析:
在程序中,pi為double型,s和r為int型。在執行s=pi*r*r;語句時,r和pi都將轉換成double型計算,所以pi*r*r的結果也為double型。但在語句s=pi*r*r;中,s為int型,pi*r*r的結果為double型,賦值號兩邊的數據類型不相同,故賦值結果仍為int型,即舍去pi*r*r結果的小數部分。
2.強製類型轉換
強製類型轉換是通過類型轉換運算來實現的,其一般形式為:
(類型說明符)(表達式)
其功能是把表達式的運算結果強製轉換成類型說明符所表示的類型。例如:
(float)a/*把變量a的值強製轉換成float型*/
(int)(x+y)/*把表達式x+y的值強製轉換成int型*/
(float)(5/3)/*把表達式5/3的值強製轉換成float型*/
在使用強製轉換時需要注意,類型說明符和表達式都必須加括號(單個變量可以不加括號),如果把(int)(x+y)寫成(int)x+y,則結果是把x轉換成int型之後再與y相加。
無論是強製類型轉換或是自動類型轉換,得到的是一個所需類型的中間結果,原來變量的類型未發生變化。
[例311]
voidmain()
{
floatf=817;
inti=(int)f;
printf("f=%f,i=%d\n",f,i);
}
運行結果:
f=8170000,i=8
程序分析:
(int)f的作用是提供一個int型的中間結果,而f本身的類型並沒有改變,因此(int)f的值為8,而f的值仍為817。