胖胖的龙 · 2022年09月13日 · 江苏

【MM32F5270开发板试用】浮点型数据结构在MCU中的数据格式

最近使用MM32F5270开发板做一些项目过程中有用到浮点类型(float double)的数据。其中遇到了一些问题,不免对浮点型数据在MCU中的存储以及函数参数传递形式产生一些好奇。带着这样的疑问,笔者基于MM32F5270开发板较为深入的研究了浮点型数据在MCU中的存储以及作为函数参数的一些具体问题以及答案。

一、 浮点数据的存储

例1:18.5(float)
float编码规范:第一位是符号位;后面8位是指数位基于0x3F+N(N是浮点数转换后第一个小数点移动到第一个非0位所移动的位数左移为正右移为负);实数部分就是保留第一个非0位后面的数据然后补0.
例如
0x41940000(float)

符号位指数(01111111+n)10010.1
01000001100101000000000000000000
正数01111111+400101

例2:18.0005(double)
double编码规范:第一位是符号位;后面11位是指数位基于0x3FF+N(N是浮点数转换后第一个小数点移动到第一个非0位所移动的位数左移为正右移为负);实数部分就是保留第一个非0位后面的数据然后补0.
0x40320020C49BA5E3(double)

符号位指数(01111111+n)10010.000000000010000011000100100110111010010111100011
正数10000000011.0010000000000010000011000100100110111010010111100011
001111111111+40010000000000010000011000100100110111010010111100011

例3:18.2
0x41900106(float)

0 10000011001000000000001000001100x40320020C0000000(double)
0 100000000110010000000000010000011000000000000000000000000000000

二、 浮点数据传参

注意事项(不一定完全正确,笔者估计应该与编译器以及编译参数有关):
1.函数中float能以float * 指针形式传递参数
函数实参0x41900106 --- 函数获取0x41900106
2.函数可以通过double类型传递浮点型数据
函数实参0x40320020 C0000000 --- 函数获取0x40320020 C0000000
3.函数形参中使用float类型只能传递浮点低32bit数据,高32bit数据会丢失掉(小端)
函数实参0x40320020 C0000000 --- 函数获取0x00000000 C0000000
备注:文章中数据都是直接在函数运行过程中通过MM32F5270串口以8位数据格式发送到串口调试助手中获取。

推荐阅读
关注数
6106
内容数
272
灵动MM32 MCU相关技术知识,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息