為什麼這篇Keil 指標鄉民發文收入到精華區:因為在Keil 指標這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者james732 (好人超)看板C_and_CPP標題Re: [問題] 請教 Keil C中指標...
※ 引述《bioer2003 (單魚座)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: windows7 ,keil c
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: 問題(Question):
: 請問下方程式指甚麼樣的動作呢?
: x= *(float*)&a1
: a1為整數
: x為浮點數
: &a1是找a1的位址
: (float*)就看不太懂,只把a1地址強制轉為指標?
首先要知道一件事情:
對於人類來說同樣都是一個數字 100
對於電腦來說,存成 int 或者存成 float 是完全不一樣的
假如你的電腦,整數使用二補數來存,浮點數使用 IEEE754
int與float都是32位元
int i = 100; // i 存在記憶體裡的是 00000000000000000000000001100100
float f = 100f; // f 存在記憶體裡的是 01000010110010000000000000000000
如果不知道為什麼 100 會變成後面那串數字
整數請查詢「二補數」,浮點數請查詢「IEEE 754 」
回到你的問題:
int main()
{
int al = 100;
// al 存在記憶體裡面實際上的東西是 00000000000000000000000001100100
float x = 0, y = 0;
x = *(float *)&al;
// x 存在記憶體的東西也是 00000000000000000000000001100100
// 直接把 al 記憶體的內容複製給x,沒有任何改變
// 但以 IEEE 754 來說,這個數卻是 1.4013e-043
y = al;
// y 存在記憶體裡的東西是 01000010110010000000000000000000
// 這就是 IEEE 754 所定義的浮點數 100 這個數字了
// compiler會做一個把「整數100」變成「浮點數100」的轉換
return 0;
}
x = *(float *)&al 這行,如果拆成這樣,不知道會不會比較好理解
int *tmpIptr = &val;
float *tmpFptr = (float *)tmpIptr;
x = *tmpFptr;
總之就是對compiler說:
「把al裡的二進位資料當作float,不要雞婆給我轉換,直接塞進x裡面」
最後,如果是用C++要看到這些數值的話,可以這樣寫 http://ideone.com/T3i2w
(變數名稱很隨便,大家就別計較了)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.92.122
※ 編輯: james732 來自: 114.32.92.122 (05/01 22:15)
其實 float *tmpFptr = (float *)tmpIptr;
跟 float *tmpFptr = tmpIptr;
它們實際上做的事情是完全一樣的,都只是一個「複製值」的動作
但如果沒有寫 (float *) 的話,compiler 會跟你抱怨型態不符而吐出 error
因為 int * 跟 float * 嚴格算是兩種不同的型態,不能直接複製過去
那個 (float *) 講白一點,就只是哄哄 compiler 而已 XD
更正確的說,那個動作是告訴 compiler
「我知道它們是不同的型態,我也知道自己在幹嘛,你照做就對了」
compiler 就會覺得「你都這麼說了,我也不跟你囉嗦」
※ 編輯: james732 來自: 114.32.92.122 (05/02 00:04)