計算機進行算術運算時,要求各操作數的類型具有相同的大小(存儲位數)及存儲方式,不能將char 型( 1 字節)數據與 int 型(2、4或8字節)數據直接參與運算;由於存儲方式的不同,也不能將 int 型數據與 double 型數據直接參與運算。
然而,由於 C語言的靈活性,在一個表達式或一條語句中,允許不同類型的數據混合運算。
C語言的靈活性與計算機的機械性是一對矛盾,如處理不好,將會產生錯誤結果。對於某些類型的轉換編譯器可隱式地自動進行,不需程序員干預,稱這種轉換為自動類型轉換;而有些類型轉換需要程序員顯式指定,這種類型轉換稱為強制類型轉換。
一、自動類型轉換
一個表達式中出現不同類型間的混合運算,較低類型將自動向較高類型轉換。
不同數據類型之間的差別在於數據的取值范圍和精度上,一般情況下,數據的取值范圍越大、精度越高,其類型也越“高級”。
整型類型級別從低到高依次為:
signed char->unsigned char->short->unsigned short->int->unsigned int->long->unsigned long
浮點型級別從低到高依次為:
float->double
float浮點類型被我們棄用了,所以不提它了。
1、操作數中沒有浮點型數據時
當 char、unsigned char、short 或 unsigned short出現在表達式中參與運算時,一般將其自動轉換為 int 類型。
int 與 unsigned int混合運算時,int自動轉換為unsigned int型。
int、unsigned int 與 long 混合運算時,均轉換為 long 類型。
2、操作數中有浮點型數據時
當操作數中含有浮點型數據時,所有操作數都將轉換為 double 型。
例如:
int ii=100;
double dd=200.5;
ii+dd;
上述算術表達式中操作數 dd 為double,所以先把ii轉換為double浮點數后再參與運算,運算結果為雙精度浮點數300.5。
3、賦值運算符兩側的類型不一致時
當賦值運算符的右值(可能為常量、變量或表達式)類型與左值類型不一致時,將右值類型提升/降低為左值類型。例如:
double dd;
dd=10; // 右值為雙精度,左值為整數
由於左值dd為雙精度浮點型,所以先把右值整型常量10 提升為雙精度浮點型后,再賦值給dd,不但不丟失精度反而提高了精度。
int ii;
ii=10.5; // 右值10.5為雙精度,左值為整型
右值雙精度型 10.5 降低為左值整型,即10.5舍棄小數部分后,把10 賦給整型變量ii,這種情況會丟失精度。
4、右值超出左值類型范圍時
更糟糕的情況是,賦值運算符右值的范圍超出了左值類型的表示范圍,將把該右值截斷后,賦給左值。所得結果可能毫無意義。例如:
char c; // char占8位,取值范圍是-128-127。
c=1025; // 整數1025 對應二進制形式是100 0000 0001,超出了8位。
printf("%d",c) ; // 以十進制輸出c的值
該輸出結果為 1,因為只取 1025 低 8 位 0000 0001(值為1),賦給字符型變量c,得到毫無意義的值。
二、強制類型轉換
雖然自動類型轉換不需要人工干預,使用方便,但有利也有弊,尤其當自動類型轉換是從較高類型轉換為較低類型時,將會降低精度或截斷數據,可能得不到預期的結果。
為了給程序設計人員提供更多的類型轉換控制權限,使程序設計更加靈活,轉換的目的更加清晰,C語言提供了可顯式指定類型轉換的語法,通常稱之為強制類型轉換。
強制類型轉換的格式為:
(目標類型) 表達式;
例如:
int a,b;
a=4;
b=3;
double dd;
dd=a/b; // dd的結果將是1。
dd=(double)(a/b); // dd的結果是1.000000。
dd=(double)a/b; // dd的結果是1.333333
dd=a/b,dd的結果是1,這個很好理解,因為整數除整數還是整數,沒有小數部分。
dd=(double)(a/b),dd的結果也是1.000000,這個不好理解,它的運算過程是:
(1)先運算a/b,得到的結果是整數的1;
(2)把整數的1轉換成double,是1.000000。
dd=(double)a/b,dd的結果是1.333333,這個也不好理解,它的運算過程是:
(1)先執行(double)a,把a轉換為double,即4.000000;
(2)把4.00000除以3,得到1.333333,符合自動類型轉換的規則。
這里還有個問題,程序員搞不清楚是(double)a優先還是a/b優先,最好的辦法是寫成這樣((double)a)/b,這樣就沒有疑問了。
三、課后作業
編寫示例程序,把本章節介紹的知識點全部演示一遍,用程序演示可以加深您的理解和映象。
四、版權聲明
C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道
如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!