2011年7月11日 星期一

C資料轉換(Type Transform)

有關C++中的各種資料轉換我一直很苦惱,書上也不說,只好自己整理。其中,要先了解各Data Type的值的範圍,計算方式是:

2^(所占的位元組*8)

如求signed short(signed代表接受正負數)值的範圍:(short占2位元組)

-2^[(2*8)/2] ~ 2^[(2*8)/2]-1 = -32768 ~ 32767

接下來,各種Data Type轉換前要先注意:

  1. 轉換的資料型別大小是否會讓數值遺失
  2. 轉換後要顯示幾位(如果是float 或是 double型別的話)
  3. 要隱式轉換還是顯式轉換
  4. 轉換時是否會有四捨五入 或是 無條件捨去\進位 的狀況
現在最麻煩的東西來了,在C++中有整數型及浮點型,兩者互轉也要注意,現在就針對以下四點做說明
  1. 整數轉浮點
  2. 整數轉整數
  3. 浮點轉浮點
  4. 浮點轉整數
整數轉浮點中,因為像float等精準度夠高(-10^38 ~ 10^38-1),int 或是 char轉過去是沒有問題的,以下僅作二範例:

int a = 4563;
float f = (float)a;   //顯式轉換,明確告訴編譯器要將a轉成float型別
printf("%f\n",f);

結果:   4563.000000
要注意,轉成float 或是 double要注意尾巴會出現6個0(因為float和double的精準度是含小數點以下共7位)

這次用隱式轉換:

int a = 4563;  
printf("%f\n",a);   //隱式轉換,偷偷地告訴編譯器要將a轉成float型別

結果:  0.000000
在顯示/隱式轉換是會有差別的,通常顯式轉換較不容易出錯

而在整數轉整數中,要注意的僅有各型別的位元組大小,如int是4 bytes,char 是1bytes,轉換時須記得「小轉大」就行了,但如果變成大轉小呢?這時要很小心,如把int轉成char:

int a = 4563;
char c = (char)a;
printf("%d\n",c);

結果:  -45
因為char僅有1位元組(-128 ~ 127)所以它的值會從-128過了127再繞一直到-45。

浮點轉浮點其實跟整數轉整數大同小異,要注意的部分就是「小轉大」、「大轉小」的部分就是了。

最後最難的莫過於浮點轉整數了,我被他搞了很久才知道要如何對付他:

float f = 3.6F;   //後面標示"F"代表它是float資料型別
int i = (int)f;
printf("%d\n",i);

結果:  3
在這裡,C++採用"無條件捨去",這點要特別注意

最後,如果我先把int轉成float再轉回int呢?這時也要小心,因為float只容許小數以下7位,所以若int的值太大就容易出錯:

int k = 99999998;
float f = (float)k;
int j = (int)f;
printf("%d\n", j);

結果:  10000000
因為當k轉成float會變成9.9999998e+007,但是float小數點後的位數只能容納6位(7-小數點 = 6),所以值會變成1.000000e+008,再轉成int就變成10^8了。所以在資料轉換時一定要特別小心才不出錯喔!


沒有留言:

張貼留言