作者wei115 (ㄎㄎ)
看板C_and_CPP
標題Re: [問題] 二進位轉float.double
時間Sun Nov 12 00:57:20 2017
好奇做了實驗,float 和 int 的位元數都是32bit,所以轉換資料型態(指標)後printf
的值應該會是一樣,結果也是如此,但後來想說:如果用4個 char 的陣列,轉型為
float的指標(和int的指標)後答案應該和前面兩個值一樣,但最後出來的值卻天差地遠
想想或許開始的地方才是最低位,所以我把存入 char 的值顛倒放,結果還是錯的,再
想想,根據我薄弱的組合語言觀念,認為應該是X86的設計是高位存高,低位存低,所以
我保持每一個 char 的順序,但是將他顛倒放,結果就正確了
我的推論是正確的嗎?如果正確,是否表示這樣的方式在不同CPU架構下得出的解答不同?
程式碼如下
https://ideone.com/jRauO1
#include<stdio.h>
int main()
{
float fvar = 1001.1;
int *pivar = (int *)(&fvar);
printf("i = %d f = %f\n", *pivar, fvar);
int ivar = 1148864102;
float *pfvar = (float *)(&ivar);
printf("i = %d f = %f\n", ivar, *pfvar);
//1148864102 = 0x447A4666
//char cvar[4] = {0x44, 0x7A, 0x46, 0x66};
char cvar[4] = {0x66, 0x46, 0x7A, 0x44};
int *ctoi = (int *)cvar;
float *ctof = (float *)cvar;
printf("i = %d f = %f\n", *ctoi, *ctof);
return 0;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.46.193.235
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1510419444.A.5B1.html
※ 編輯: wei115 (114.46.193.235), 11/12/2017 00:58:35
→ youchenliu: little-endian 11/12 01:41
推 chuegou: 一樓正解 前幾篇推文也有 11/12 01:46
推 alan23273850: 推有實驗精神 11/12 02:19
推 remember: 現在一般情況下也不容易找得到big-endian 的機器惹 QQ 11/12 19:51
推 Hazukashiine: little endian 某種程度上來說是比較好的 11/12 19:53
→ Hazukashiine: 至少不同長度的值在定址上是一致的 不需要偏移量 11/12 19:54
推 alan23273850: 再推樓上解說,以前老師從沒提過little endian的優 11/12 20:30
→ alan23273850: 點,我以前常覺得數字順序跟位址順序相反有點惱人, 11/12 20:31
→ alan23273850: 現在終於懂了 11/12 20:31
推 rice9547: 學到了,謝謝! 11/14 12:12
→ stupid0319: big-endian常用在網路傳輸 11/14 14:24