C隱式類型轉換

C的隱式類型轉換


    隱式類型轉換分三種,即算術轉換、賦值轉換和輸出轉換。

1.算術轉換

    進行算術運算(加、減、乘、除、取餘以及符號運算)時,不同類型數招必須轉換成同 一類型的數據才能運算,算術轉換原則爲:

   整型提升:對於所有比int小的類型,包括char, signed char, unsigned char, short, unsigned short,首先會提升爲int類型。

    在進行運算時,以表達式中最長類型爲主,將其他類型位據均轉換成該類型,如:

(1)若運算數中有double型或float型,則其他類型數據均轉換成double類型進行運算。

(2)若運算數中最長的類型爲long型.則其他類型數均轉換成long型數。

(3)若運算數中最長類型爲int型,則char型也轉換成int型進行運算。算術轉換是在運算過程中自動完成的。

    特別注意的是有符號和無符號之間的轉換:

    包含long與unsigned int,32位機器上都是4字節,所以均轉換爲unsigned long.

    包含signed與unsigned int,signed會轉換爲unsigned。如果int恰好爲負數,其結果爲對unsigned取值個數求模的結果。比如將-1賦給8位的unsigned char,呢麼結果就是255(-1對256取模後的值)。unsigned char取值範圍0~255。

2.賦值轉換

    進行賦值操作時,賦值運算符右邊的數據類型必須轉換成賦值號左邊的類型,若右邊的數據類型的長度大於左邊,則要進行截斷或舍入操作。

下面用一實例說明:

      char ch;

      int i,result;

      float f;

      double d;

      result=ch/i+(f*d-i);

(1)首先計算 ch/i,ch → int型,ch/i → int型。

(2)接着計算 f*d-i,由於最長型爲double型,故f→double型,i→double型,f*d-i→double型。

(3)(ch/i) 和(f*d-i)進行加運算,由於f*d-i爲double型,故ch/i→double型,ch/i+(f*d-i)→double型。

(4)由於result爲int型,故ch/i+(f*d-i)→double→int,即進行截斷與舍入,最後取值爲整型。

3.輸出轉換

    在程序中將數據用printf函數以指定格式輸出時,當要輸出的鹽據類型與輸出格式不符時,便自動進行類型轉換,如一個long型數據用整型格式(%d)輸出時,則相當於將long型轉換成整型(int)數據輸出;一個字符(char)型數據用整型格式輸出時,相當於將char型轉 換成int型輸出。

注意:較長型數據轉換成短型數據輸出時,其值不能超出短型數據允許的值範圍,否則 轉換時將出錯。如:

      long a=80000;

      printf("%d",a);

運行結果爲14464,因爲int型允許的最大值爲32767,80000超出此值,故結果取以32768爲模的餘數,即進行如下取餘運算:

      (80000-32768)-32768=14464;

輸出的數據類型與輸出格式不符時常常發生錯誤,如:

      int d=9;

      printf("%f",d);

      float c=3.2;

      printf("%d",c);

將產生錯誤的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章