C語言規定,不同類型的數據需要轉換成同一類型後纔可進行計算,在整型、實型和字符型數據之間通過類型轉換便可以進行混合運算(但不是所有類型之間都可以進行轉換)
.當混合不同類型的變量進行計算時,便可能會發生類型轉換
相同類型的數據在轉換時有規則可循:
字符必須先轉換爲整數(C語言規定字符類型數據和整型數據之間可以通用)
short型轉換爲int型(同屬於整型)
float型數據在運算時一律轉換爲雙精度(double)型,以提高運算精度(同屬於實型)
賦值時,一律是右部值轉換爲左部類型
[注]
當整型數據和雙精度數據進行運算時,C先將整型數據轉換成雙精度型數據,再進行運算,結果爲雙精度類型數據
當字符型數據和實型數據進行運算時,C先將字符型數據轉換成實型數據,然後進行計算,結果爲實型數據
2.4 數據類型轉換在C語言的表達式中,准許對不同類型的數值型數據進行某一操作或混合運算。當不同類型的數據進行操作時,應當首先將其轉換成相同的數據類型,然後進行操作。數據類型轉換有兩種形式,即隱式類型轉換和顯示類型轉換。
2.4.1 隱式類型轉換所謂隱式類型轉換就是在編譯時由編譯程序按照一定規則自動完成,而不需人爲干預。因此,在表達式中如果有不同類型的數據參與同一運算時,編譯器就在編譯時自動按照規定的規則將其轉換爲相同的數據類型。
C語言規定的轉換規則是由低級向高級轉換。例如,如果一個操作符帶有兩個類型不同的操作數時,那麼在操作之前行先將較低的類型轉換爲較高的類型,然後進行運算,運算結果是較高的類型。更確切地說,對於每一個算術運算符,則遵循圖2-2所示的規則。
圖2-2 數據類型轉換規則之一
注意:在表達式中,所有的float類型都轉換爲double型以提高運算精度。
在賦值語句中,如果賦值號左右兩端的類型不同,則將賦值號右邊的值轉換爲賦值號左邊的類型,其結果類型還是左邊類型。
因爲函數參數是表達式,因此,當參數傳遞給函數時,也發生類型轉換。具體地說,char和short均轉換爲int;float轉換爲double。這就是爲什麼我們把函數參數說明爲int和double,儘管調用函數時用char和float .
也可以將圖2-2所示的規則用圖2-3表示。圖2-3中的水平箭頭表示必定轉換,縱向箭頭表示兩個操作對象類型不同時的轉換方向。
圖2-3 數據類型轉換規則之二
下面舉行說明類型轉換的規則。例如執行:
x=100+'a'+1.5 * u+f/'b'-s * 3.1415926
其中,u爲unsigned型,f爲float型,s爲short型,x爲float型。式中右面表達式按如下步驟處理:
(1)首先將'a'、'b'和s換成int,將1.5和f轉換爲double型。
(2)計算100+'a',因'a'已轉換爲int型,於是此運算結果爲197。
(3)計算1.5*u,由於1.5已轉換爲double,u是unsigned型,於是首先u轉換爲double,然後進行運算,運算結果爲double。
(4)計算197+1.5 * u,先將197轉換爲double(如197.00…00),其結果爲double。
(5)計算f/ 'b',f已轉換爲double,'b'已轉換爲int,於是先將'b'再轉換爲double,其結果爲double。
(6)計算(197+1.5 * u)+f / 'b',者均爲double,於是結果也爲double。
(7)計算s * 3.1415926,先將s由int轉換爲double,然後進行運算,其結果爲double。
(8)最後與前面得的結果相減,結果爲double。
(9)最後將表達式的結果轉換爲float並賦給x。
。
。
。
。
先看程序:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char**argv){
unsigned int right = 1;
char left = -1;
if(left < right)printf("%d < %d\n", left, right);
else if(left == right)printf("%d = %d\n", left, right);
else printf("%d > %d\n", left, right);
system("PAUSE");
return 0;
}
運行結果是:-1 > 1
解釋:按步驟進行.
1. 如果其中一個操作數爲long double類型,則另一個操作數被轉換爲long double.
2. 否則,如果其中一個操作數爲double, 則另一個操作數被轉換爲double.
3. 否則,如果其中一個操作數爲float, 則另一個操作數也轉換爲float.
4. 否則,兩個操作數進行 "整型升級":
a. 如果其中一個操作數爲unsigned long int, 則另一個操作數也被視爲unsigned long int.
b. 否則,如果其中一個操作數爲long int,而另一個操作數類型是unsigned int, 並且long int能夠表示unsigned int的所有值,則另一個操作數也被視爲long int;如果long int不能表示unsigned int的所有值,則兩個數都被視爲unsigned long int.
c. 否則, 如果其中一個操作數是long int,則另一個操作數也被視爲long int.
d. 否則, 如果其中一個操作數是unsigned int, 則另一個操作數也被視爲unsigned int.
e. 否則, 兩個操作數都被視爲int.