資料型態的轉換
什麼是資料型態的轉換?
我們說 int sum;
的意義是 sum 這個變數裡所記錄的資料當成整數來用,
同時在放置資料到 sum 變數內時將資料轉為整數格式,
還真是繞口,
為什麼不說 sum 這個變數只能放整數資料
或是乾脆說 sum 是個整數變數 就好了呢?
這三個口述的解釋中第三個最簡捷,
但是也最模糊,
根本沒提到究竟要如何來使用 sum 這個變數,
這種打迷糊仗的說法任何人不能說它是錯的;
第二個解釋若是深入地去看會有一點問題,
但是一般來講如果 sum
這個變數內存放的是整數資料的話 (例如: sum=10;)
那麼在使用 sum 這個變數內存放的資料時
(例如: average = sum/total;)
sum 內的資料當然是整數,
以上例來說的確是這樣子的,
可是觀念上卻是錯的,
首先程式在執行時資料的型態 (是整數還是浮點數還是字元)
不是資料的屬性,
而是程式解讀資料的方法,
就好像數字串 1270 到底是十進位的 1270
還是八進位的 696 還是十六進位的 472,
端看你如何去解釋它。
CPU 在使用一個變數內儲存的資料時也有類似的狀況,
等到你學到指標的時候我們可以示範如何在一個整數變數中放一個浮點數、
或是如何把一個字元當作是整數在使用...。
第一個解釋其實是由變數的用法衍生出來的操作型定義,
涵蓋了變數的兩種基本用法:
-
CPU 在存放資料到變數內時,
需要先把資料的型態轉換為與變數的型態相同,
-
CPU 在任何地方要直接使用變數內存放的資料時,
會以變數定義的型態來解釋其內存放資料的內容。
範例
例如:
int x;
float y;
x = 1.0; // 1.0 是一個浮點常數,因此需要先轉為整數格式才能放進變數 x 之中
x = 1.0 * 20; // 20 是一個整數常數,需要轉為浮點數才能和 1.0 相乘
y = 25; // 25 是一個整數,因些需要先轉為浮點數格式才能放進變數 y 之中
x = y; // y 內的資料是浮點格式,因些需要先轉換為整數格式才關放進變數 x 之中
上面這幾個敘述其實相當於
x = (int)1.0; //(int) 是轉為整數格式的運算子
x = (int) (1.0*(double)20);
x = (float) 25;
x = (int) y;
請注意:
變數如何傳入 printf() 函式? 變數的型態有什麼影響?
請注意
在使用 printf() 函式時所有的變數不是"直接"地被使用,
這些變數內的資料會根據它的型態做最保守的位元擴充,
不做任何格式的轉換,
printf() 函式的內部根本看不到這些變數的型態,
因此在列印時並不是看變數的型態來列印的,
而是看相對應的型態描述字元 (%d, %c, %s, %x...)
來解釋變數內的資料的,
詳情請看
printf() 函式進階格式轉換說明
。
例:
float x=1.0;
printf("%f %x %d\n",x,x,x);
C 語言中 Compiler 幫你做自動型態轉換的時機
-
Assignment Statement:
例如: int x; x = 15.5;
-
運算式 (+, -, *, /, >, <...):
例如: int x; x = x * 1.5;
-
函式呼叫:
例如:
int oneSimpleFunction(int x, double z)
{
....
}
....
oneSimpleFunction(1.5, 20);