C 語言中各種變數的型態

參考

課本 page 167-179

各種變數的型態

在 C 語言中變數的型態分為

  1. 基本型態

  2. 使用者自定型態

兩大類, 基本型態包括

  1. char
  2. int
  3. short (int)
  4. long (int)
  5. float
  6. double

六種,使用者自定的型態是指以 enum, struct, union 所定義之型態, 以下僅就第一類進行簡單的介紹, 第一類中的整數型態及字元型態尚可配合 unsigned 用來存放非負整數資料。

  1. char

    使用單一位元組 (八個位元), 可以存放一個 ASCII 編碼的字元, 或是以二進位存放一個 0 - 255 之間的整數, 或是以二的補數法存放一個 -128 - 127 之間的整數。

  2. short

    使用雙位元組, 可以用二進位存放一個 0 - 65535 (2^16-1) 之間的整數, 或是以二的補數法存放一個 -32768 - 32767 之間的整數。

  3. long

    使用四個位元組, 可以用二進位存放一個 0 - 2^32-1 之間的整數, 或是以二的補數法存放一個 -2^31 - 2^31-1 之間的整數。

  4. float

    使用四個位元組, 可存放以 IEEE 754 格式 sign, mantissa, exponent 方法表示之浮點數, 範圍約在 ±10^38 至 ±10^(-38) 之間, 其 roundoff 誤差與數值大小有關, 誤差與數值之比約為 10^(-7)。

  5. double

    使用八個位元組, 可存放以 IEEE 754 格式 sign, mantissa, exponent 方法表示之浮點數, 範圍約在 ±10^308 至 ±10^(-308) 之間, 其 roundoff 誤差與數值大小有關, 誤差與數值之比約為 10^(-16)。

roundoff 誤差

所謂的 roundoff 誤差是指表示法的誤差, 例如以下列敘述存放資料時 實際上變數 x 內存放的值不是 1.234567890123 而是 範圍內的某一數值, 若以下列敘述列印可知 或是以下列程式片段來檢查:

第 8 位數以後就不正確了,是不是?

可以用另外一個角度來想, 4 個位元組總共 32 個位元, 可以有 2^32 (大約是 10^9) 種組合, 假設每一種組合代表一個 10^38 ~ -10^38 中的一個數字的話, 顯然無法表示其中每一個數字, 甚至連每一個整數都不可能, 因此在這範圍內只能挑一些代表的數值如下圖:

兩端間隔很大,反正數值已經那麼大了, 多錯一點也是應該的, 間隔與數值的比例維持在大約 10^(-8), 所能表示的數字絕對值最小約 10^(-38), 若是 double 型態的話, 間隔與數值的比例維持在大約 10^(-16), 所能表示的數字絕對值最小約 10^(-308)。

overflow 訊息

打算存入的數值超過變數最大數值以後 Turbo C 會產生 overflow 的訊息, 例如使用 float 型態如果要置入的數超過 ± 10^38 時就會產生, 使用 double 型態如果要置入的數超過 ± 10^308 時也會產生, double 型態的運算式 (+, - , *, /) 如果數值超過 ± 10^308 時也會產生, (請注意在 C 語言中沒有 float 型態的運算式), 所有的 char, int, long, short 型態的變數當置入的數超過最大值時不會產生任何錯誤訊息, 所有的 int 或是 long 運算若是超過最大值也不會產生任何的錯誤訊息。

underflow 訊息

C 程式在執行的時候遇見處理的數值太小時不會產生任何 underflow 的訊息。

資料型態的轉換

當資料由某一種型態的變數轉存放到另一種型態變數時需要經過型態的轉換, 有些轉換只是改變位元組的多少 (例如:char <--> int <--> long), 有些轉換則對資料有實質上的改變 (例如:int <--> float)。

程式設計課程 首頁
by Pei-yih Ting
E-mail: pyting@cs.ntou.edu.tw