1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> int main( void ) { int a = 10; float b = 4.2; printf ( "%d\n" , a / b); printf ( "%f\n" , a / b); return 0; } /* 《程式語言教學誌》的範例程式 檔名:autotype.c 功能:示範運算式中自動型態轉換 作者:張凱慶 時間:西元2010年4月 */ |
編譯後執行,結果如下

程式的第 8 行
8 | printf ( "%d\n" , a / b); |
印出的計算結果為非常大的奇怪負整數,這是因為 a / b 所得到的型態已經為浮點數,也就是 float 型態,這時用整數型態來列印,編譯器將 float 型態的位元編碼方式用整數的位元編碼方式來解釋,然後輸出給格式字串 %d ,所以才會是個奇怪的值。
第九行
9 | printf ( "%f\n" , a / b); |
按預期的浮點數型態印出,顯示出的值就是正確的。
基本上, C 語言的型態轉換分為自動轉換及強制轉換,自動轉換方面如上例,凡是儲存範圍較小的型態,如 short 遇到 int ,就會自動轉換為儲存範圍較大的型態,也就是說 short 會自動轉換成 int 。
因此概略來說,字元、整數、浮點數三型態的自動轉換方向如下

字元可看成儲存範圍較小的整數型態,若以各基本資料型態的實際名稱來看,自動轉換方向如下

強制轉換則發生在利用 cast 運算子時,或是函數呼叫時用與函數原型宣告不同的型態。利用 cast 運算子,如下例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> int main( void ) { int a = 10; float b = 4.2; printf ( "%d\n" , ( int ) (a / b)); printf ( "%f\n" , a / b); return 0; } /* 《程式語言教學誌》的範例程式 檔名:casttype.c 功能:示範利用 cast 運算子進行強制資料型態轉換 作者:張凱慶 時間:西元2010年4月 */ |
編譯後執行,如下

程式的第 8 行
8 | printf ( "%d\n" , ( int ) (a / b)); |
我們重新加入了 cast 運算子,所以結果印出為整數無誤。
函數呼叫應用的強制型態轉換方面,如下例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <stdio.h> double max( double , double ); int main( void ) { int a = 22; int b = 34; printf ( "較大值是 %f\n" , max(22, 34)); return 0; } double max( double x, double y) { if (x > y) { return x; } else { return y; } } /* 《程式語言教學誌》的範例程式 檔名:calltype.c 功能:示範函數呼叫的強制資料型態轉換 作者:張凱慶 時間:西元2010年4月 */ |
編譯後執行,如下

由於函數 max() 宣告為需要兩個型態為 double 的參數,在程式的第 10 行呼叫函數 max() 時,雖然是用兩個整數作為參數,但會強制轉換成與函數宣告相符的 double 型態,因此,函數 max() 的回傳值自然也是 double 型態。
1 則留言:
我想函數呼叫max(22, 34)應該改成max(a,b)才是您本章的教學目標
張貼留言