C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 閱讀:16,783

C語言自動類型轉換和強制類型轉換詳解

計算機硬件進行算術操作時,要求各操作數的類型具有相同的大小(存儲位數)及存儲方式。例如,由于各操作數大小不同,硬件不能將 char 型( 1 字節)數據與 int 型( 2 或 4 字節)數據直接參與運算;由于存儲方式的不同,也不能將 int 型數據與 float 型數據直接參與運算。

然而,由于 C 語言編程的靈活性,在一個表達式或一條語句中,允許不同類型的數據混合運算。

C 語言的靈活性與計算機硬件的機械性是一對矛盾,如處理不好,將會產生錯誤結果。對于某些類型的轉換編譯器可隱式地自動進行,不需人工干預,稱這種轉換為自動類型轉換;而有些類型轉換需要編程者顯式指定,通常,把這種類型轉換稱為強制類型轉換

自動類型轉換

一個表達式中出現不同類型間的混合運算,較低類型將自動向較高類型轉換。

不同數據類型之間的差別在于數據的表示范圍及精度上,一般情況下,數據的表示范圍越大、精度越高,其類型也越“高級”。

整型類型級別從低到高依次為:

int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long

浮點型級別從低到高依次為:

float -> double


1) 操作數中沒有浮點型數據時:

當 char、unsigned char、short 或 unsigned short 出現在表達式中參與運算時,一般將其自動轉換為 int 類型,特殊情況下 unsigned short 也可能轉換成 unsigned int(如 Turbo C2.0 中,short 和 int 所占字節數相同,unsigned short 的正數表示范圍比 int 大,故將其轉換為 unsigned int)。

int 與 unsigned int混合運算時:

int -> unsigned int

int、unsigned int 與 long 混合運算時,均轉換為 long 類型。

2) 橾作數中有浮點型數據時:

當操作數中含有浮點型數據(float 或 double)時,所有操作數都將轉換為 double 型。

例如:
3+5.3f+1.7
上述算術表達式中操作數 1.7 為雙精度浮點數,故先把 3 和單精度浮點數 5.3 自動提升為雙精度浮點數后,參與運算。運算結果為雙精度浮點數 10.0。

3) 賦值運算符兩惻的類型不一致時:

當賦值運算符的右值(可能為常量、變量或表達式)類型與左值類型不一致時,將右值類型可能提升或降低為左值類型。例如:
double d;
d=5.1f;
由于左值為雙精度浮點型,故先把右值單精度浮點型常量 5.1 提升為雙精度浮點型后,再賦值給 d,不但不丟失精度反而提高了精度。
int i;
i=5.1; //右值5.1為雙精度,左值為整型
右值雙精度浮點型 5.1 降低為左值整型,即 5.1 舍棄小數部分后,把 5 賦給整型變量 i,這種情況會丟失精度。

4) 右值超出左值類型范圍時:

更糟糕的情況是,賦值運算符右值的范圍超出了左值類型的表示范圍,將把該右值截斷后,賦給左值。所得結果可能毫無意義。例如:
char c; //char 占8位,表示范圍-127?128
c=1025; //1025 對應二進制形式:100 0000 0001,超出了8位
printf("%d",c) ; //以十進制輸出c的值
該輸出結果為 1,因為只取 1025 低 8 位 0000 0001(值為1),賦給字符型變量 c,故得到毫無意義的值。

當 return 后的表達式類型與函數的返回值類型不一致時,也會自動把 return 后表達式的值轉換為函數類型后,再返回。

當函數調用時,所傳實參與形參類型不一致時,也會把實參自動轉換為形參類型后再賦值。

強制類型轉換

雖然自動類型轉換不需要人工干預,使用方便,但有利也有弊,尤其當自動類型轉換是從較高類型轉換為較低類型時,將會降低精度或截斷數據,可能得不到預期的結果。

為了給程序設計人員提供更多的類型轉換控制權限,使程序設計更加靈活,轉換的目的更加清晰,C 語言提供了可顯式指定類型轉換的語法支持,通常稱之為強制類型轉換。

強制類型轉換的格式為:

(目標類型) 表達式

例如,計算某工廠目前可出廠的產品總件數用 total 表示,該工廠共有三個車間,已知:1 車間目前完成 10.9 件,2 車間目前完成 12.7 件,3 車間目前完成 11.8 件。則:
int total;
total=(int)10.9+(int)12.7+(int)11.8;
故 total=10+12+11=33,符合題意。

而如果采用如下的自動類型轉換:
int total=10.9+12.7+11.8;
其值將為 35。因為賦值運算符右端表達式 10.9+12.7+11.8=35.4 為雙精度浮點型,而左值 total 類型為整型,將 35.4 自動轉換為整數 35 后賦給 total。與題意不符。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo