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

作者: wei115 (ㄎㄎ)   2017-11-12 00:57:20
好奇做了實驗,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;
}
作者: youchenliu (柚子味的豆花)   2017-11-12 01:41:00
little-endian
作者: chuegou (chuegou)   2017-11-12 01:46:00
一樓正解 前幾篇推文也有
作者: alan23273850   2017-11-12 02:19:00
推有實驗精神
作者: remember (人老也有天使收)   2017-11-12 19:51:00
現在一般情況下也不容易找得到big-endian 的機器惹 QQ
作者: Hazukashiine (私は幸せです)   2017-11-12 19:53:00
little endian 某種程度上來說是比較好的至少不同長度的值在定址上是一致的 不需要偏移量
作者: alan23273850   2017-11-12 20:30:00
再推樓上解說,以前老師從沒提過little endian的優點,我以前常覺得數字順序跟位址順序相反有點惱人,現在終於懂了
作者: rice9547 (一碗飯)   2017-11-14 12:12:00
學到了,謝謝!
作者: stupid0319 (徵女友)   2017-11-14 14:24:00
big-endian常用在網路傳輸

Links booklink

Contact Us: admin [ a t ] ucptt.com