看板 C_and_CPP 關於我們 聯絡資訊
有鑑於這次程設課出的作業,我想和大家分享3種不同方式轉換十進位和 浮點數,礙於版面,我將以片段程式碼呈現 1.指標強制轉換型態 float a ; int*b ; scanf("%f",a); b = (int*)&a ; //只有int才能和做位元運算,所以轉成整數 for ( j = 31 ; j>=0 ; j--) if ( *b & 1 << j) //&為bit運算子 非&&,而用意是在test b的二進位每個 位置是0還是1,若為1(true)則印出1 printf("1"); else printf("0"); ...........如何做相反的動作呢?? float* f ; int test=0 , a[32]; char b[32]; scanf("%s",b);//將01000...讀成字串 for(i=0 ; i<32 ; i++) if( b[i] =='1') a[i]=1; else a[i]=0; for(i=0 ; i<32 ; i++){ test = test << 1; test = test + a[i]; } //此步驟也是為甚麼要將字元陣列轉整數陣列 f = (float*)&test ; //同樣的技巧 最後在印出float,注意+* printf(......,*f); 2. union 概念就是宣告 int 和 float 在同一個union 利用共用記憶體的概念 印出bit pattern union test { float f ; int a ; }; union test TEST //宣告 scanf("%f",TEST.f); for(i=31 ; i>=0 ;i--) if( TEST.a & 1<<i) //因為共用記憶體 所以float(32bit)和int每個bit紀錄的 010...是一樣的,所以test 整數內的bit 並印出 printf("1"); else printf("0"); ..........如何反過來呢?? 同樣讀成字串再轉整數陣列(不再冗述) int test ; int c[32]; for ( i=0 ; i<32 ; i++) { test = test <<1; test = test + c[i]; } TEST.a = test ; //將讀到的010...存入整數在asign給union內的 int,透過共用記憶體 ,此刻float存的東西(二進位) 已經一樣,直接印出float即可 printf("%f",TEST.f); 3. bit field 非常繁瑣,概念就是在struct中宣告32次變數並給予bit field 1 , 再將這個struct放入union中 ,而union內還有一個float struct test { unsigned a1:1 , a2:1 .......a32:1}; union k { struct test TEST; float f ;}; union k K ; scanf("%f",K.f); printf("%d"%d"......,K.TEST.a32,K.TEST.a31,.....) // 值得注意的是記得要反過 來印,因為bit field的記憶體位置是反過來設的 a32 a31 a30...... 1 1 1 (bit) 大概是這樣 所以先讀的會放到最後宣告的bit field 那如何反過來做呢?? 同樣的先將字串變成整數陣列 再將每個 整數陣列(非0則1)asign給 union內的struct的a 由於過於繁瑣 給一個範例 K.TEST.a32 = c[0] ; //該注意的地方也是要反著asign.同樣的理由 ... .... printf("%f",K.f); 今天的分享大概到這裡 由於第一次分享文章,若有疏漏請指正,感謝各位大大!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.110.8 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1510660987.A.EAE.html
chuegou: 其實這問題滿常被問的 大約一季一次吧 小弟我以前也回過 11/14 20:25
chuegou: 不過我沒列最後一種 11/14 20:26
stupid0319: 如果是浮點數跟整數之間的轉換呢?要研究一下嗎 11/14 20:47
stupid0319: 有想過100.5轉成整數的話,是100還是101? 11/14 20:48
Ommm5566: 當然是看選round還是ceiling或floor阿 11/14 23:12
Lipraxde: 你是要轉成raw bit,講成轉十進位會讓人誤會= = 11/15 00:52
alan23273850: 推樓上,我剛開始以為是十進位 兩個差那麼多....... 11/15 01:05
alan23273850: 嚴格說起來raw bit是修正過後的二進位 11/15 01:06
F04E: 完全不曉得做這件事的意義 11/15 18:03