全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2287
推到 Plurk!
推到 Facebook!

一個float變數是由4bytes所組成,我們直接更改bytes內的值嗎?

尚未結案
kokalin
一般會員


發表:13
回覆:19
積分:6
註冊:2004-07-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-02 14:29:25 IP:140.112.xxx.xxx 未訂閱
一般我們指定浮點數都是直接宣告為float或double形式 而浮點數的格式都是遵照IEEE745標準 也就是一個float變數是由4個bytes所組成 而這4個bytes(32bits)配置也各有其定義 請問有方法能夠直接指定這32bits來組成一個浮點數值嗎? PS.會想這麼做是因為我會從8051藉由RS232傳值給PC 而我要利用這傳來的值組成一個浮點數 因此才會想詢問有沒有能夠直接指定浮點數配置記憶體的方法
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-02 15:38:22 IP:210.243.xxx.xxx 未訂閱
引言: 一般我們指定浮點數都是直接宣告為float或double形式 而浮點數的格式都是遵照IEEE745標準 也就是一個float變數是由4個bytes所組成 而這4個bytes(32bits)配置也各有其定義 請問有方法能夠直接指定這32bits來組成一個浮點數值嗎? PS.會想這麼做是因為我會從8051藉由RS232傳值給PC 而我要利用這傳來的值組成一個浮點數 因此才會想詢問有沒有能夠直接指定浮點數配置記憶體的方法
雖然我沒做過這樣的東西, 不過你可以把float拆為4個bytes, 在依需求做處理
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  float f = 10;
  BYTE* pByte = (BYTE*)&f;
  ShowMessage("修改前:"   FloatToStr(f));      pByte[0] = 10;      ShowMessage("第1個byte:0x"   IntToHex(pByte[0], 2));
  ShowMessage("第2個byte:0x"   IntToHex(pByte[1], 2));
  ShowMessage("第3個byte:0x"   IntToHex(pByte[2], 2));
  ShowMessage("第4個byte:0x"   IntToHex(pByte[3], 2));      ShowMessage("修改後"   FloatToStr(f));
}
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-02 17:03:59 IP:202.145.xxx.xxx 未訂閱
試試看 union     下面的例子參考看看,不過…直接改byte 得出來的值似乎很難理解 < class="code">#include #include //#include "UserDefine.h" typedef union { float value; struct Dword { unsigned long u32; } U32; struct bytes { unsigned char byte0; unsigned char byte1; unsigned char byte2; unsigned char byte3; } byte; }test; int main(int argc, char *argv[]) { test a ; char bitstr[33]; memset(bitstr,0,33); a.value=12.345742; printf("%f\n",a.value); printf("\n"); printf("%x\n",a.byte.byte0); printf("%x\n",a.byte.byte1); printf("%x\n",a.byte.byte2); printf("%x\n",a.byte.byte3); printf("\n"); ShowFirstHiBit(a.U32.u32,bitstr,'0','1',32); printf ("%s\n",bitstr); a.byte.byte0=99; ShowFirstHiBit(a.U32.u32,bitstr,'0','1',32); printf ("%s\n",bitstr); printf("%f\n",a.value); system("PAUSE"); return 0; } void ShowFirstHiBit(unsigned long value,char *bitstr,char symbol_0,char symbol_1,unsigned char length) {//使用前要清空array unsigned char i; unsigned long mask=1; mask=mask<<(length-1); for (i=0;i>1; } }
鈴鐺
初階會員


發表:33
回覆:81
積分:35
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-02 17:16:15 IP:202.145.xxx.xxx 未訂閱
用 union 觀念 typedef union { float f; char c[4]; } fc; int main() { fc v; v.c[0]=10; v.c[1]=-41; v.c[2]=35; v.c[3]=60; // 相當於 v.f=0.01 return 0; }
kokalin
一般會員


發表:13
回覆:19
積分:6
註冊:2004-07-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-03 13:13:33 IP:140.112.xxx.xxx 未訂閱
感謝各位的指導 使用指標和union測試過後發現都是很不錯的方式 但目前我還有一個問題 1.有沒有辦法不是直些更改1個byte的內容 而是去更改byte內特定的bit內容 因為我經由8051傳給PC的值可能會經過處理後再分配至適當的位元位置 因此能夠位元處理對我來說是最恰當不過了 發表人 - kokalin 於 2005/02/03 16:20:08
laputa1224
一般會員


發表:0
回覆:2
積分:0
註冊:2005-01-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-03 16:48:20 IP:210.192.xxx.xxx 未訂閱
BYTE b; 假設你b的值是0xAA 二進位的形式為10101010 ) 要設定bit為0要使用AND 舉例來說,若是要讓第一個bit的值為0 就 AND 11111110 (AA & FE) 同樣的讓第二個bit為0, 就 AND 11111101 (AA & FD) 要設定bit為1要使用OR 舉例來說,若是要讓第一個bit的值為1 就 OR 00000001 (AA | 01) 同樣的讓第二個bit為1, 就 OR 00000010 (AA | 10) 以此類推
系統時間:2024-05-19 16:37:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!