2^(所占的位元組*8)
如求signed short(signed代表接受正負數)值的範圍:(short占2位元組)
-2^[(2*8)/2] ~ 2^[(2*8)/2]-1 = -32768 ~ 32767
接下來,各種Data Type轉換前要先注意:
- 轉換的資料型別大小是否會讓數值遺失
- 轉換後要顯示幾位(如果是float 或是 double型別的話)
- 要隱式轉換還是顯式轉換
- 轉換時是否會有四捨五入 或是 無條件捨去\進位 的狀況
現在最麻煩的東西來了,在C++中有整數型及浮點型,兩者互轉也要注意,現在就針對以下四點做說明
- 整數轉浮點
- 整數轉整數
- 浮點轉浮點
- 浮點轉整數
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);
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了。所以在資料轉換時一定要特別小心才不出錯喔!
因為當k轉成float會變成9.9999998e+007,但是float小數點後的位數只能容納6位(7-小數點 = 6),所以值會變成1.000000e+008,再轉成int就變成10^8了。所以在資料轉換時一定要特別小心才不出錯喔!
沒有留言:
張貼留言