C 教材:其他資料型態與它們之間的轉換

如果是第一次閱讀,那麼先看看就好。以後再回來複習,會逐漸明白。

除了 intdouble 之外, C 還有其他幾種基本的資料型態:charshortlongfloat。 它們都是保留字。 其中 char 是用 8 bits (1 byte) 記錄、以二補數解讀的整數, short 是用 16 bits (2 byte) 記錄、以二補數解讀的整數。 所以,宣告為 char 的變數,在記憶體中佔據一個 byte, 它能夠記錄從 -128 到 127 之間 (含) 的所有整數。 其他的資料型態,都留到以後再談。

讀者或許注意到,在 fahr70.c 裡面,我們定義 fahr 的指令是

fahr = 70;
雖然 70 是個整數,但是 fahr 宣告為浮點數, 所以,當 C 要定義 fahr 的值的時候, 必須先將整數 70 轉變為浮點數 70.0,再以浮點數的解讀方式, 將 70.0 儲存到記憶體裡面。 所以,上面那個語句的效果,和下面這個相同:
fahr = 70.0;
也和下面這個相同:
fahr = 70.;

當我們將「小」的整數資料型態轉換給「大」的整數資料型態的時候, 它的值不會失真。例如將 char 的值轉換給 int 是安全的。 但是,反過來就不一定了。比方說,實驗

char c;
int x;
x=1025;
c=x;
printf("%d\n", c);
x=255;
c=x;
printf("%d\n", c);
得到答案
1
-1
其實,當執行 c=x; 的時候,C 只是把 x 之中最小的 8 個 bits 定義成 c 的值。 當 x=1025 時,c 得到的位元組 (bit pattern) 是
00000001
所以解釋成 1。當 x=255 時,c 得到的位元組是
11111111
所以解釋成 -1。

在前面的實驗中,我們順便看到,不論變數的資料型態是 intshort 還是 char,輸出格式都可以用 %d

double 的值轉換給 int,相當於只取 double 的整數部分。 如果那個數恰好是個整數,就不會有誤差。否則必然會失真。 反之,將 int 的值轉換給 double, 因為雙精度浮點數的底數部分有 52 位 (52 bits),而整數的紀錄範圍大約是 -231 與 231 之間,所以轉換沒有誤差。

float 是單精度浮點數,以前的電腦硬體做浮點數計算的能力較弱時, 經常為了節省時間而採用這種變數型態。不過,如今的電腦都很快速, 記憶體容量一般也不成問題,所以我們乾脆建議不再採用這種變數型態。

習題

  1. 宣告為 short 的變數,在記憶體中佔據幾個 bytes? 它能夠記錄從多少到多少之間 (含) 的所有整數?
  2. int 型態的整數值超過多少的時候,轉換給 short 型態會失真?
  3. 舉出一個 short 型態資料的例子,使得它轉換給 char 型態會失真。

[BCC16-C]
單維彰 (2000/03/24) --- 03/04/24 (單)
[Prev] [Next] [Up]