2017年5月22日 星期一

float double 為什麼 指針 陣列 轉型出來數值會異常 (錯誤)

float double 為什麼 指針 陣列 轉型出來數值會異常

主要是因為浮點數儲存格式比較特別,直接轉成int通常會得到錯誤的結果
看看下面的例子
float f=1, *fp=&f;
int* i = (int*)fp;
cout << "i=" << *i << endl;
出來的結果為
i=1065353216;
會是一個很奇怪的數字,主因是因為不正確的解析
這裡說一個我自己的比喻,可能不是很正確,但可以幫助理解
指標轉型 (int*) 選擇用什麼方式解密 (還沒解密)
選擇後 reference 才是真正的解密
如文中一開始的情況
嘗試把一個 float 加密的資料 fp
float f=1, *fp=&f;
選擇使用 int 解密方式
int* i = (int*)fp;
解密得到錯誤的結果
cout << "i=" << *i << endl;
如何獲得正確的結果需要選擇使用正確的方式解密
cout << "i=" << *(float*)fp << endl;
轉譯的過程需要一個實體空間的暫存
int temp = *(float*)fp;
    i = &temp;
int 與 float 儲存格式是不一樣的,如果你想使用 int 的解密方式
(某個函式的接收參數)
void fun(int*);
你只能重新劃分一塊新的鎮列儲存,否則你不能期待把一個A方法加密的檔案檔用B方法解密
void fun(int*);

float* fp;
fun((int*)fp);
你將得到錯誤的結果

沒有留言:

張貼留言