標籤:
1、算術轉換
許多運算子都會引發轉換,以類似的方式產生結果類型,這個模式稱為“尋常算術轉換”。
首先,任何類型為char或short的運算元被轉換為int,任何類型為float的運算元被轉換為double。其次,如果其中一個運算元類型為double,那麼另一個運算元被轉換為double,計算結果類型也是double。再次,如果其中一個運算元類型為long,那麼另一個運算元被轉換為long,計算結果類型也為long。或者,其中一個運算元的類型數unsigned,那麼另一個運算元被轉換為unsigned,計算結果類型也為unsigned。如果不符合上面幾種情況,那麼兩個運算元的類型都為int,計算結果類型也為int。
2、字元和整數
char,short int或int型位段,包括它們的有符號或無符號變形,以及枚舉類型,可以使用在需要int或unsigned int的運算式中。如果int可以完整表示源類型的所有值,那麼該源類型的值就轉換為int,否則轉換為unsigned int。
3、尋常算術轉換
許多運算元類型為算術類型的雙目運算子會引發轉換,並以類似的方式產生結果類型。它的目的是產生一個普遍類型,同時也是運算結果的類型。
首先,如果其中一個運算元的類型是long double,那麼另一個運算元也會被轉換為long double。其次,如果其中一個運算元類型為double,那麼另一個運算元也被轉換為double。再次,如果其中一個運算元的類型為float,那麼另一個運算元也被轉換為float。否則,兩個運算元進行整形提升,執行下面的規則:如果其中一個運算元類型為unsigned long int,那麼另一個運算元也被轉換成unsigned long int。其次,如果其中一個運算元的類型是long int,而另一個運算元類型是unsigned int,如果long int能完整表示unsigned int的所有值,那麼unsigned int類型運算元被轉換為long int,如果long int 不能完整表示unsigned int的所有值,那麼兩個運算元都被轉換為unsigned long int。再次,如果其中一個運算元的類型是long int,那麼另一個運算元被轉換為long int。再再次,如果其中一個運算元的類型是unsigned int,那麼另一個運算元被轉換為unsigned int。如果所有以上情況都不屬於,那麼兩個運算元都為int。
浮點運算元和浮點運算式的值可以用比類型本身所要求的更大的精度和更廣的範圍表示,而它的類型並不因此改變。
——摘自《C專家編程》
C語言的整形提升