1.自動(dòng)類(lèi)型轉換
● 字符型變量的值實(shí)質(zhì)上是一個(gè)8位的整數值,因此取值范圍一般是-128~127,char型變量也可以加修飾符unsigned,則unsigned char 型變量的取值范圍是0~255(有些機器把char型當做unsighed char型對待, 取值范圍總是0~255)。
● 如果一個(gè)運算符兩邊的運算數類(lèi)型不同,先要將其轉換為相同的類(lèi)型,即較低類(lèi)型轉換為較高類(lèi)型,然后再參加運算,轉換規則如下圖所示。
double ←── float 高
↑
long
↑
unsigned
↑
int ←── char,short 低
● 圖中橫向箭頭表示必須的轉換,如兩個(gè)float型數參加運算,雖然它們類(lèi)型相同,但仍要先轉成double型再進(jìn)行運算,結果亦為double型。 縱向箭頭表示當運算符兩邊的運算數為不同類(lèi)型時(shí)的轉換,如一個(gè)long 型數據與一個(gè)int型數據一起運算,需要先將int型數據轉換為long型, 然后兩者再進(jìn)行運算,結果為long型。所有這些轉換都是由系統自動(dòng)進(jìn)行的, 使用時(shí)你只需從中了解結果的類(lèi)型即可。這些轉換可以說(shuō)是自動(dòng)的,但然,C語(yǔ)言也提供了以顯式的形式強制轉換類(lèi)型的機制。
● 當較低類(lèi)型的數據轉換為較高類(lèi)型時(shí),一般只是形式上有所改變, 而不影響數據的實(shí)質(zhì)內容, 而較高類(lèi)型的數據轉換為較低類(lèi)型時(shí)則可能有些數據丟失。
2.賦值中的類(lèi)型轉換
當賦值運算符兩邊的運算對象類(lèi)型不同時(shí),將要發(fā)生類(lèi)型轉換, 轉換的規則是:把賦值運算符右側表達式的類(lèi)型轉換為左側變量的類(lèi)型。具體的轉換如下:
(1) 浮點(diǎn)型與整型
● 將浮點(diǎn)數(單雙精度)轉換為整數時(shí),將舍棄浮點(diǎn)數的小數部分, 只保留整數部分。
將整型值賦給浮點(diǎn)型變量,數值不變,只將形式改為浮點(diǎn)形式, 即小數點(diǎn)后帶若干個(gè)0。注意:賦值時(shí)的類(lèi)型轉換實(shí)際上是強制的。
(2) 單、雙精度浮點(diǎn)型
● 由于C語(yǔ)言中的浮點(diǎn)值總是用雙精度表示的,所以float 型數據只是在尾部加0延長(cháng)為doub1e型數據參加運算,然后直接賦值。doub1e型數據轉換為float型時(shí),通過(guò)截尾數來(lái)實(shí)現,截斷前要進(jìn)行四舍五入操作。
(3) char型與int型
● int型數值賦給char型變量時(shí),只保留其最低8位,高位部分舍棄。
● chr型數值賦給int型變量時(shí), 一些編譯程序不管其值大小都作正數處理,而另一些編譯程序在轉換時(shí),若char型數據值大于127,就作為負數處理。對于使用者來(lái)講,如果原來(lái)char型數據取正值,轉換后仍為正值;如果原來(lái)char型值可正可負,則轉換后也仍然保持原值, 只是數據的內部表示形式有所不同。
(4) int型與1ong型
● long型數據賦給int型變量時(shí),將低16位值送給int型變量,而將高16 位截斷舍棄。(這里假定int型占兩個(gè)字節)。
將int型數據送給long型變量時(shí),其外部值保持不變,而內部形式有所改變。
(5) 無(wú)符號整數
● 將一個(gè)unsigned型數據賦給一個(gè)占據同樣長(cháng)度存儲單元的整型變量時(shí)(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照賦,內部的存儲方式不變,但外部值卻可能改變。
● 將一個(gè)非unsigned整型數據賦給長(cháng)度相同的unsigned型變量時(shí), 內部存儲形式不變,但外部表示時(shí)總是無(wú)符號的。
/*例:賦值運算符舉例 */
main()
{ unsigned a,b;
int i,j;
a=65535;
i=-1;
j=a;
b=i;
printf("(unsigned)%u→(int)%d\n",a,j);
printf("(int)%d→(unsigned)%u\n",i,b);
}
運行結果為:
(unsigned)65535→(int)-1
(int)-1→(unsigned)65535
● 計算機中數據用補碼表示,int型量最高位是符號位,為1時(shí)表示負值,為0時(shí)表示正值。如果一個(gè)無(wú)符號數的值小于32768則最高位為0,賦給 int型變量后、得到正值。如果無(wú)符號數大于等于32768,則最高位為1, 賦給整型變量后就得到一個(gè)負整數值。反之,當一個(gè)負整數賦給unsigned 型變量時(shí),得到的無(wú)符號值是一個(gè)大于32768的值。
● C語(yǔ)言這種賦值時(shí)的類(lèi)型轉換形式可能會(huì )使人感到不精密和不嚴格,因為不管表達式的值怎樣,系統都自動(dòng)將其轉為賦值運算符左部變量的類(lèi)型。
● 而轉變后數據可能有所不同,在不加注意時(shí)就可能帶來(lái)錯誤。 這確實(shí)是個(gè)缺點(diǎn),也遭到許多人們批評。但不應忘記的是:c面言最初是為了替代匯編語(yǔ)言而設計的,所以類(lèi)型變換比較隨意。當然, 用強制類(lèi)型轉換是一個(gè)好習慣,這樣,至少從程序上可以看出想干什么。