写入和读取float型数据

我怕爱的太早我们不能终老 提交于 2020-01-10 10:16:32

一、目的

  • 写入和读取float数据

二、环境

  • 开发工具:DEV-C++

三、方法

  1. 傻瓜式方法
    假如存储1.234,那么先把1.234*1000=1234,将1234存到存储器中。读取出来的时候,再将1234/1000=1.234,这个方法很简答易懂,但是精度不高。

  2. byte数组与指针
    关键:一是数据以二进制的形式存储;二是简单应用数组和指针。
    接下来直接上代码:

    unsigned char a[4];   
	unsigned char i;
	unsigned char *P,*PX;
	float b1 = 1.123,b2;
	void *Fl;                //不确定类型指针 
	
	printf("b1=%f\n\n", b1);
	
	//float转到byte数组 
	P = (unsigned char*)&b1; //指针指向b1的首地址 
	
	for(i=0; i<4; i++)
	{
		a[i] = *(P+i);       //将四个字节的float数,一个一个字节地存入数组中 
		printf("a[%d]=%x\n", i,a[i]);
	}
	
	//byte数组转到float
	 Fl = &b2;              //指针指向b2的首地址 
	 PX = a;                //指针指向数组a[4]的首地址 
	 for(i=0; i<4; i++)
	 {
	 	*((unsigned char*)Fl+i) = *(PX + i);   //以指针为桥梁,进行赋值 
	 	printf("*(PX+%d)=%x\n",i,*(PX + i));
	 }
	 printf("\nb2=%f\n", b2);

运行结果如下:

b1=1.123000

a[0]=77
a[1]=be
a[2]=8f
a[3]=3f
*(PX+0)=77
*(PX+1)=be
*(PX+2)=8f
*(PX+3)=3f

b2=1.123000

另外,将float数据的四个字节存到数组中,还可以用memcpy函数,后续的读数据和之前是一样的,代码如下:

    float a = 1.123, c;
	unsigned char *p;
	unsigned char i;
	unsigned char b[4];
	
	//输出a的地址
	printf("%x\n",&a);
	
	//指针p指向a的地址
	p = (unsigned char*)&a; 
	
	//拷贝指针p地址的4个字节到数组b[]
	memcpy(b, p, 4); 
	
	for(i=0; i<4; i++)
	{
		//输出数组的4个字节所包含的数值 
		printf("%x\n", b[i]);
	}

运行结果如下:

77
be
8f
3f
  1. 联合体
    这一种方法和上一种方法都是牢牢抓住“数据是以二进制形式存储”这一核心。只是上一种方法是通过指针和数组,而这一种方法是通过联合体,但都是通过地址来传输数据的。
    代码如下:
union Transmit    //定义结构体 
{
	float a;
	int b;
} ;

union Transmit K;

int main(void)
{
	unsigned char a[4]; 
	unsigned char b[4]; 
	unsigned char i;
	unsigned char *Pa,*Pb;
	
	float c = 1.123; 
	
	//用联合体存储float型数据
	K.a  = c;
	Pa =  (unsigned char*)&K.a;
	Pb =  (unsigned char*)&K.b;
	
	//打印出K.a和K.b的各个字节 
	for(i=0; i<4; i++)
	{
		printf("K.a的第%d个字节=%x\n",i+1, *(Pa+i));
        printf("K.b的第%d个字节=%x\n",i+1, *(Pb+i));	
	}
}

运行结果如下:

K.a的第1个字节=77
K.b的第1个字节=77
K.a的第2个字节=be
K.b的第2个字节=be
K.a的第3个字节=8f
K.b的第3个字节=8f
K.a的第4个字节=3f
K.b的第4个字节=3f

从中可见,把值赋值给联合体中的float型数据(K.a),那么另外的int型数据(K.b)的各个字节和float型数据(K.a)的各个字节是一样的,这样就直接存储和读取int型数据的各个字节就可以了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!