问下关于C的问题: 怎样将一个浮点数拆成四个字节?
如题. 如果要传输浮点数, 应该怎办? 把浮点数分成四个字节? 还是有更好的办法? 关注,如果要用1602B LCD 显示浮点数,大家有什么好的办法? volatile float Pi = 3.14159;
unsigned char *Pt;
unsigned char Arr;
void main( void )
{
unsigned char i;
Pt = (unsigned char *)(&Pi);
for(i=0; i<4; i++)
{
Arr = *Pt++;
}
while(1);
} 1楼,你定义的时候用联合就OK了,不用自己操心
2楼,当然是ftoa了
3楼,太罗嗦了! 这个问题我关注很长时间了,很多人问过,很多高手都解答过,
基本答案都是一样的,用指针或者用联合体,性质也是一样的.
但是我试验就是试不出来,像2楼的程序我在pc的标准c,比如tc2.0里面试验则得到:
/*
希望的值是
Arr=33
Arr=31
Arr=34
Arr=31
实际的值是
Arr=208
Arr=15
Arr=73
Arr=64
*/
程序就是2楼的程序,
#include <stdio.h>
volatile float Pi = 3.14159;
unsigned char *Pt;
unsigned char Arr;
int main( void )
{
unsigned char i;
Pt = (unsigned char *)(&Pi);
for(i=0; i<4; i++)
{
Arr = *Pt++;
}
printf("%d
",5);
printf("%d
",Arr);
printf("%d
",Arr);
printf("%d
",Arr);
printf("%d
",Arr);
//while(1);
}
在单片机上面试验
USART_Transmit(Arr+48);
USART_Transmit(Arr+48);
USART_Transmit(Arr+48);
USART_Transmit(Arr+48);
从串口发出去,则也是错误的,得到 ?yp 这样几个乱字符.
所以还是得问问,
1.是不是pc里面和单片机里面的浮点数的存储方式不一样?
2.像2楼这个程序,我想一定是能正常工作的,但是我试不出来.应该怎样试验?
很初级的问题,拜托2楼的laoma大侠,或其他过路的高手,能给指点一下,尤其是怎么能试验确认,谢谢. 4楼,你对浮点数的理解完全错误,32位浮点数里面是1位符号,23位尾数和8位偏移阶码构成的。所以你写的那些完全是错误的,至于你想要的结果,其方法“【3楼】 appleboy ”已经给出来了,仔细看。 多谢schwarz 指教,我再好好看看. 基本上明白了,再次感谢schwarz.
浮点数是按照一种规则存放在4个字节里面的.描述这个规则的文件叫做IEEE-754.
以下程序仍然是在tc2.0下编译和运行.
#include <stdio.h>
typedef union
{
floatf;
unsigned char u;
}Float4Byte;
int main(void)
{
Float4Byte m1,m2;
m1.f=-1.2356;
m2.u=m1.u; //假设这里经过了一个传输过程.
m2.u=m1.u;
m2.u=m1.u;
m2.u=m1.u;
printf("m1=%f
",m1.f);
printf("m2=%f
",m2.f);
return 0;
}
运行结果:
m1=-1.235600
m2=-1.235600 楼上用法习惯不太好.............就算要用联合......最好不要那样用......要尽量维持一个变量的数据类型,比不得已不要改变其数据类型........
volatile float Pi = 3.14159;
unsigned char Arr;
typedef union
{
floatf;
unsigned char u;
}Float4Byte;
Float4Byte *Pt;
void main( void )
{
unsigned char i;
Pt = (Float4Byte *)(&Pi);
for(i=0; i<4; i++)
{
Arr = Pt->u;
}
while(1);
} 谢谢,受教了 关注 存储方式是由编译器和数据类型决定的
我做dsp2812的时候,float,double型变量用ccs编译后,发现都是以4字节存储的
结果直接导致浮点运算精度不够
只好换用arm7,在keil和iar下试验,确定double型以8字节方式存储,才敢继续做下去 谢谢了,参考到了
页:
[1]