看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)
purpose:好人呀 05/01 22:22
james732:難得有個我可以回答的問題...XDD 05/01 22:23
handsome616:天阿 怎麼有看沒有懂!!! 05/01 23:24
james732:唔,我盡力了 orz 05/01 23:40
EdisonX:james 人真好.. 05/01 23:46
bioer2003:感謝^^,再請教一下(float *)是對tmpIptr影響甚麼?謝謝 05/02 00:00
其實 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)
cuteclare:解釋的真好~ 05/02 00:12
QQ29:x = *(float *)&al 會不會解釋成 請把a1這32bits解釋成浮點數 05/02 00:28
QQ29:會比較好懂呢? 05/02 00:28
angleevil:應該要發卡了 05/02 10:31
ksmrt0123:Keil C51的int是16-bit; C敘述(statement)不清楚的話, 05/02 13:27
ksmrt0123:可配合compiler編出的assembly一起看就很清楚了 05/02 13:28