歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

詳解C語言的類型轉換

1.自動類型轉換

•字符型變量的值實質上是一個8位的整數值,因此取值范圍一般是-128~127,char型變量也可以加修飾符unsigned,則unsigned char 型變量的取值范圍是0~255(有些機器把char型當做unsighed char型對待, 取值范圍總是0~255)。

•如果一個運算符兩邊的運算數類型不同,先要將其轉換為相同的類型,即較低類型轉換為較高類型,然後再參加運算,轉換規則如下圖所示。

•圖中橫向箭頭表示必須的轉換,如兩個float型數參加運算,雖然它們類型相同,但仍要先轉成double型再進行運算,結果亦為double型。 縱向箭頭表示當運算符兩邊的運算數為不同類型時的轉換,如一個long 型數據與一個int型數據一起運算,需要先將int型數據轉換為long型, 然後兩者再進行運算,結果為long型。所有這些轉換都是由系統自動進行的, 使用時你只需從中了解結果的類型即可。這些轉換可以說是自動的,當然,C語言也提供了以顯式的形式強制轉換類型的機制。

•當較低類型的數據轉換為較高類型時,一般只是形式上有所改變, 而不影響數據的實質內容, 而較高類型的數據轉換為較低類型時則可能有些數據丟失。

•在進行自動類型轉換的時候,如果原來的數是無符號數,那麼在擴展的時候,高位填充的是0;如果是有符號數,那麼高位填充的時符號位!

2.賦值中的類型轉換

當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換, 轉換的規則是:把賦值運算符右側表達式的類型轉換為左側變量的類型。具體的轉換如下:

(1) 浮點型與整型

•將浮點數(單雙精度)轉換為整數時,將捨棄浮點數的小數部分, 只保留整數部分。將整型值賦給浮點型變量,數值不變,只將形式改為浮點形式, 即小數點後帶若干個0。注意:賦值時的類型轉換實際上是強制的。

(2) 單、雙精度浮點型

•由於C語言中的浮點值總是用雙精度表示的,所以float 型數據只是在尾部加0延長為doub1e型數據參加運算,然後直接賦值。doub1e型數據轉換為float型時,通過截尾數來實現,截斷前要進行四捨五入操作。

(3) char型與int 型

•int型數值賦給char型變量時,只保留其最低8位,高位部分捨棄。

•chr型數值賦給int型變量時, 一些編譯程序不管其值大小都作正數處理,而另一些編譯程序在轉換時,若char型數據值大於127,就作為負數處理。對於使用者來講,如果原來char型數據取正值,轉換後仍為正值;如果原來char型值可正可負,則轉換後也仍然保持原值, 只是數據的內部表示形式有所不同。

(4) int型與1ong 型

•long型數據賦給int型變量時,將低16位值送給int型變量,而將高16 位截斷捨棄。(這裡假定int型占兩個字節)。將int型數據送給long型變量時,其外部值保持不變,而內部形式有所改變。

(5) 無符號整數

•將一個unsigned 型數據賦給一個占據同樣長度存儲單元的整型變量時(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照賦,內部的存儲方式不變,但外部值卻可能改變。

•將一個非unsigned整型數據賦給長度相同的unsigned型變量時, 內部存儲形式不變,但外部表示時總是無符號的。

/*例:賦值運算符舉例 */
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);
}

運行結果為:

•計算機中數據用補碼表示,int型量最高位是符號位,為1時表示負值,為0時表示正值。如果一個無符號數的值小於32768則最高位為0,賦給 int型變量後、得到正值。如果無符號數大於等於32768,則最高位為1, 賦給整型變量後就得到一個負整數值。反之,當一個負整數賦給unsigned 型變量時,得到的無符號值是一個大於32768的值。(這裡假定int型占兩個字節)
•C語言這種賦值時的類型轉換形式可能會使人感到不精密和不嚴格,因為不管表達式的值怎樣,系統都自動將其轉為賦值運算符左部變量的類型。
•而轉變後數據可能有所不同,在不加注意時就可能帶來錯誤。 這確實是個缺點,也遭到許多人們批評。但不應忘記的是:C面言最初是為了替代匯編語言而設計的,所以類型變換比較隨意。當然, 用強制類型轉換是一個好習慣,這樣,至少從程序上可以看出想干什麼。


3.強制類型轉換

可以利用強制類型轉換運算符將一個表達式轉換成所需類型:
例如:
(double)a      (將a轉換成double類型)
(int)(x+y)      (將x+y的值轉換成整型)
(float)(5%3)    (將5%3的值轉換成float型)
(int)(1.5+2.3) = 3 
(int)1.5+2.3=?

對於從高到低的強制轉換,實質上就是一個截斷的操作,只把低端需要的部分保留,其余的部分直接扔掉了。

Copyright © Linux教程網 All Rights Reserved