一、目的
- 写入和读取float数据
二、环境
- 开发工具:DEV-C++
三、方法
-
傻瓜式方法
假如存储1.234,那么先把1.234*1000=1234,将1234存到存储器中。读取出来的时候,再将1234/1000=1.234,这个方法很简答易懂,但是精度不高。 -
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
- 联合体
这一种方法和上一种方法都是牢牢抓住“数据是以二进制形式存储”这一核心。只是上一种方法是通过指针和数组,而这一种方法是通过联合体,但都是通过地址来传输数据的。
代码如下:
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型数据的各个字节就可以了。
来源:CSDN
作者:Norway1217
链接:https://blog.csdn.net/weixin_42598260/article/details/103830373