Re: [問題] 二進位轉float.double

看板C_and_CPP作者 (ㄎㄎ)時間8年前 (2017/11/12 00:57), 8年前編輯推噓6(605)
留言11則, 7人參與, 8年前最新討論串4/4 (看更多)
好奇做了實驗,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

11/12 01:41, 8年前 , 1F
little-endian
11/12 01:41, 1F

11/12 01:46, 8年前 , 2F
一樓正解 前幾篇推文也有
11/12 01:46, 2F

11/12 02:19, 8年前 , 3F
推有實驗精神
11/12 02:19, 3F

11/12 19:51, 8年前 , 4F
現在一般情況下也不容易找得到big-endian 的機器惹 QQ
11/12 19:51, 4F

11/12 19:53, 8年前 , 5F
little endian 某種程度上來說是比較好的
11/12 19:53, 5F

11/12 19:54, 8年前 , 6F
至少不同長度的值在定址上是一致的 不需要偏移量
11/12 19:54, 6F

11/12 20:30, 8年前 , 7F
再推樓上解說,以前老師從沒提過little endian的優
11/12 20:30, 7F

11/12 20:31, 8年前 , 8F
點,我以前常覺得數字順序跟位址順序相反有點惱人,
11/12 20:31, 8F

11/12 20:31, 8年前 , 9F
現在終於懂了
11/12 20:31, 9F

11/14 12:12, 8年前 , 10F
學到了,謝謝!
11/14 12:12, 10F

11/14 14:24, 8年前 , 11F
big-endian常用在網路傳輸
11/14 14:24, 11F
文章代碼(AID): #1Q1olqMn (C_and_CPP)
文章代碼(AID): #1Q1olqMn (C_and_CPP)