C 速查手冊

型態轉換

運算式 (expression) 裡有不同資料型態 (data type) 的時候,編譯器 (compiler) 會在編譯時會自動進行型態轉換,例如運算中參雜整數及浮點數時

#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;
}

/* 《程式語言教學誌》的範例程式
    https://kaiching.org/
    檔名:autotype.c
    功能:示範運算式中自動型態轉換
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc autotype.c
$ a.out
-279021456
2.380953
$

程式中第一個 a / b

printf("%d\n", a / b);

印出的計算結果為非常大的奇怪負整數,這是因為 a / b 所得到的型態已經為浮點數,也就是 float 型態,這時用整數型態來列印,編譯器將 float 型態的位元編碼方式用整數的位元編碼方式來解釋,然後輸出給格式字串 %d ,所以才會是個奇怪的值。

第二個 a / b

printf("%f\n", a / b);

按預期的浮點數型態印出,顯示出的值就是正確的。

基本上, C 語言的型態轉換分為自動轉換及強制轉換,自動轉換方面如上例,凡是儲存範圍較小的型態,如 short 遇到 int ,就會自動轉換為儲存範圍較大的型態,也就是說 short 會自動轉換成 int

因此概略來說,字元 (character) 、整數 (integer) 、浮點數 (floating-point number) 三型態的自動轉換方向如下

字元 → 整數 → 浮點數

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

char
  ↓
short
  ↓
int
  ↓
long
  ↓
long long
  ↓
float
  ↓
double
  ↓
long double

強制轉換則發生在利用 cast 運算子時,或是函數呼叫時用與函數原型宣告不同的型態。利用 cast 運算子,如下例

#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;
}

/* 《程式語言教學誌》的範例程式
    https://kaiching.org/
    檔名:casttype.c
    功能:示範利用 cast 運算子進行強制資料型態轉換
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc casttype.c
$ a.out
2
2.380953
$

程式的第一個 a / b

printf("%d\n", (int) (a / b));

這裡重新加入了 cast 運算子,所以結果印出為整數無誤。

函數 (function) 呼叫應用的強制型態轉換方面,如下例

#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(
{
    if (x > y) {
        return x;
    }
    else {
        return y;
    }
}

/* 《程式語言教學誌》的範例程式
    https://kaiching.org/
    檔名:calltype.c
    功能:示範函數呼叫的強制資料型態轉換
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc calltype.c
$ a.out
$

由於函數 max() 宣告為需要兩個型態為 double 的參數,在程式的第 10 行呼叫函數 max() 時,雖然是用兩個整數作為參數,但會強制轉換成與函數宣告相符的 double 型態,因此,函數 max() 的回傳值自然也是 double 型態。

上一頁 條件運算子
回 C 速查手冊首頁
下一頁 控制結構