變量的數(shù)據(jù)類型是可以轉(zhuǎn)換的。轉(zhuǎn)換的方法有兩種,一種是自動轉(zhuǎn)換,一種是強制轉(zhuǎn)換。

1.自動轉(zhuǎn)換
自動轉(zhuǎn)換發(fā)生在不同數(shù)據(jù)類型的量混合運算時,由編譯系統(tǒng)自動完成。自動轉(zhuǎn)換遵循的規(guī)則如圖2-3所示,可以從幾個方面來理解這個規(guī)則:
(1)若參與運算量的類型不同,則先轉(zhuǎn)換成同一類型,然后進行運算。
(2)轉(zhuǎn)換按少字節(jié)向多字節(jié)類型轉(zhuǎn)換,以保證精度不降低。如short型和long型運算時,先把short型變量轉(zhuǎn)換成long型后再進行運算。
(3)所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達(dá)式,也要先轉(zhuǎn)換成double型,再作運算。
(4)char型和short型參與運算時,必須先轉(zhuǎn)換成int型。
(5)在賦值運算中,當(dāng)“=”兩邊的運算對象類型不相同時,系統(tǒng)自動將“=”右邊表達(dá)式的值轉(zhuǎn)換成左邊變量的類型后再賦值,具體規(guī)定如下:
1)實型賦予整型,舍去小數(shù)部分;
2)整數(shù)賦予實型,數(shù)值不變,但增加小數(shù)部分(小數(shù)部分值為0);
3)字符型賦予整型,由于字符型占一個字節(jié),而整型占四個字節(jié),因此將字符的ASCII碼值放到整型量的低8位,高24位補0。
4)整型賦予字符型,只把低8位賦予字符量。
圖2-3 類型自動轉(zhuǎn)換規(guī)則
【例2-11】自動數(shù)據(jù)類型轉(zhuǎn)換
#include<stdio.h>
int main()
{
float PI=3.14159;
int s,r=5;
s=r*r*PI;
printf("s=%d\n",s);
return 0;
}
程序運行結(jié)果:
s=78
本例程序中,PI為實型,s,r為整型,在執(zhí)行s=r*r*PI語句時,r和PI都轉(zhuǎn)換成double型計算,結(jié)果也為double型,但由于s為整型,故賦值結(jié)果仍為整型,舍去了小數(shù)部分。
2.強制類型轉(zhuǎn)換
強制類型轉(zhuǎn)換是通過類型轉(zhuǎn)換運算來實現(xiàn)的。
其一般形式為:
(類型說明符) (表達(dá)式)
其功能是把表達(dá)式的運算結(jié)果強制轉(zhuǎn)換成類型說明符所表示的類型。
例如:
(float) a; /* 把a轉(zhuǎn)換為實型 */
(int)(x+y); /* 把x+y的結(jié)果轉(zhuǎn)換為整型 */
3.在使用強制轉(zhuǎn)換時應(yīng)注意以下問題:
(1)類型說明符和表達(dá)式都必須加括號(單個變量可以不加括號),如把(int)(x+y)寫成(int)x+y則成了把x轉(zhuǎn)換成int型之后再與y相加了。
(2)無論是強制轉(zhuǎn)換或是自動轉(zhuǎn)換,都只是為了本次運算的需要而對變量的數(shù)據(jù)長度進行的臨時性轉(zhuǎn)換,而不改變數(shù)據(jù)說明時對該變量定義的類型。
【例2-12】強制數(shù)據(jù)類型轉(zhuǎn)換
#include<stdio.h>
int main()
{
float f=5.75;
printf("(int)f=%d,f=%f\n",(int)f,f);
return 0;
}
程序運行結(jié)果:
(int)f=5,f=5.750000
本例表明,f雖強制轉(zhuǎn)為int型,但只在運算中起作用,是臨時的,而f本身的類型并不改變,因此,(int)f的值為5(刪去了小數(shù)),而f的值仍為5.75。