【发布时间】:2021-05-11 23:08:55
【问题描述】:
A 有一个 float 变量,我需要将它的值作为字符存储在 uint8 缓冲区中。更准确地说,给定这样的东西
float f = 123.45
uint8_t buffer[11];
memset(buffer, 0x30, sizeof(buffer)); // I set it at 0x30 because it is character '0'
鉴于此示例,我的缓冲区需要获取值:
0x30 0x30 0x30 0x30 0x30 0x31 0x32 0x33 0x2E 0x34 0x35 // 0x2E is the character '.'
不幸的是,我需要以这种方式将其与现有功能集成,因此无法绕过 11 缓冲区的大小。
任何有关如何解决此问题的建议将不胜感激。
【问题讨论】:
-
浮点数的十进制文本表示可以使用
*printf系列函数获得,例如snprintf -
我将它设置为 0x30,因为它是字符 '0' 不,不是。字符
'0'是字符'0'。使用0x30只会让事情变得混乱。 -
@Andrew Henle,他们正在解释为什么
0x30被使用而不是0。 /// @andrei filip,Andrew 的意思是'0'更清晰,并且 100% 等同于0x30(好吧,除非您使用的是 EBCDIC 系统)。 -
鉴于这是一个嵌入式系统,因此可能资源受限,您不能使用
stdio.h函数。根据您的 MCU 是否真的有 FPU,首先使用浮点可能没有意义。那么,更具体地说,这是针对什么系统? -
@andreifilip 好的,那么它的 Cortex M0+ 相当受限。你不应该在那个 MCU 上使用软件浮点或
stdio.h函数,它们会吃掉你所有的内存。请相信我在 SO 上的随机 PC 程序员。我自己现在正在使用相同的 MCU,并且我有大约 20 年的嵌入式系统编程经验。而是考虑将浮点数视为原始二进制,然后解析出整数和小数部分,存储在两个整数中,分别将它们转换为 ASCII。这比软件浮点和 stdio.h 的效率高 100 倍左右。
标签: c floating-point type-conversion uint8t