Re: [問題] 請教 Keil C中指標相關程式

看板C_and_CPP (C/C++)作者 (好人超)時間14年前 (2012/05/01 22:13), 編輯推噓5(507)
留言12則, 9人參與, 最新討論串2/2 (看更多)
※ 引述《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)

05/01 22:22, , 1F
好人呀
05/01 22:22, 1F

05/01 22:23, , 2F
難得有個我可以回答的問題...XDD
05/01 22:23, 2F

05/01 23:24, , 3F
天阿 怎麼有看沒有懂!!!
05/01 23:24, 3F

05/01 23:40, , 4F
唔,我盡力了 orz
05/01 23:40, 4F

05/01 23:46, , 5F
james 人真好..
05/01 23:46, 5F

05/02 00:00, , 6F
感謝^^,再請教一下(float *)是對tmpIptr影響甚麼?謝謝
05/02 00:00, 6F
其實 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)

05/02 00:12, , 7F
解釋的真好~
05/02 00:12, 7F

05/02 00:28, , 8F
x = *(float *)&al 會不會解釋成 請把a1這32bits解釋成浮點數
05/02 00:28, 8F

05/02 00:28, , 9F
會比較好懂呢?
05/02 00:28, 9F

05/02 10:31, , 10F
應該要發卡了
05/02 10:31, 10F

05/02 13:27, , 11F
Keil C51的int是16-bit; C敘述(statement)不清楚的話,
05/02 13:27, 11F

05/02 13:28, , 12F
可配合compiler編出的assembly一起看就很清楚了
05/02 13:28, 12F
文章代碼(AID): #1Fd-zuX3 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Fd-zuX3 (C_and_CPP)