最近使用MM32F5270开发板做一些项目过程中有用到浮点类型(float double)的数据。其中遇到了一些问题,不免对浮点型数据在MCU中的存储以及函数参数传递形式产生一些好奇。带着这样的疑问,笔者基于MM32F5270开发板较为深入的研究了浮点型数据在MCU中的存储以及作为函数参数的一些具体问题以及答案。
一、 浮点数据的存储
例1:18.5(float)
float编码规范:第一位是符号位;后面8位是指数位基于0x3F+N(N是浮点数转换后第一个小数点移动到第一个非0位所移动的位数左移为正右移为负);实数部分就是保留第一个非0位后面的数据然后补0.
例如
0x41940000(float)
符号位 | 指数(01111111+n) | 10010.1 |
---|---|---|
0 | 10000011 | 00101000000000000000000 |
正数 | 01111111+4 | 00101 |
例2:18.0005(double)
double编码规范:第一位是符号位;后面11位是指数位基于0x3FF+N(N是浮点数转换后第一个小数点移动到第一个非0位所移动的位数左移为正右移为负);实数部分就是保留第一个非0位后面的数据然后补0.
0x40320020C49BA5E3(double)
符号位 | 指数(01111111+n) | 10010.000000000010000011000100100110111010010111100011 |
---|---|---|
正数 | 10000000011 | .0010000000000010000011000100100110111010010111100011 |
0 | 01111111111+4 | 0010000000000010000011000100100110111010010111100011 |
例3:18.2
0x41900106(float)
0 10000011 | 00100000000000100000110 | 0x40320020C0000000(double) |
---|---|---|
0 10000000011 | 00100000000000100000 | 11000000000000000000000000000000 |
二、 浮点数据传参
注意事项(不一定完全正确,笔者估计应该与编译器以及编译参数有关):
1.函数中float能以float * 指针形式传递参数
函数实参0x41900106 --- 函数获取0x41900106
2.函数可以通过double类型传递浮点型数据
函数实参0x40320020 C0000000 --- 函数获取0x40320020 C0000000
3.函数形参中使用float类型只能传递浮点低32bit数据,高32bit数据会丢失掉(小端)
函数实参0x40320020 C0000000 --- 函数获取0x00000000 C0000000
备注:文章中数据都是直接在函数运行过程中通过MM32F5270串口以8位数据格式发送到串口调试助手中获取。