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