不多加细节地讲,我有两个嵌入式系统,都无法使用浮点数库。它们之间有一个移动应用程序,其中执行一些计算。一个计算需要保持精度。这个值以字节数组形式通过蓝牙发送给客户端。当它被接收后,我将其存储为uint32。然后将此值再次与移动应用程序共享,在那里需要精度。这里没有问题,因为我可以使用Java的ByteBuffer类。问题是我还需要将这个值作为uint8与Z80微处理器共享,因为它通过UART传输,并且被用作ADC计数(0-255),所以会失去精度(但在这一端不需要精度)。所以我在我的移动应用程序中使用Java来做到这一点:
int bits = Float.floatToIntBits(fAdcCount);
byte[] b = new byte[4];
b[0] = (byte)(bits & 0xff);
b[1] = (byte)((bits >> 8) & 0xff);
b[2] = (byte)((bits >> 16) & 0xff);
b[3] = (byte)((bits >> 24) & 0xff);
b
将被发送到BLE微控制器的BLE特征写入中。然后,BLE微控制器将此缓冲区作为小端32位字读取,并将其存储在uint32
中。在调试器中查看此uint32
将显示正确值,如上所述,我能够将此uint32
放回字节数组中并使用Java的ByteBuffer类发送到移动应用程序并读取它。这很好用,我得到了正确的浮点值。
问题是我需要将此浮点表示的整数部分作为uint8通过UART发送到Z80微处理器,因为它用作从0-255的ADC计数。
那么,如何将已包装成uint32(小端字节顺序)的浮点值转换为uint8,以便失去精度?我还知道范围是0-255,这意味着永远不会有大于255.0要转换的内容。
例如,如果我有这个:
uint32 fValue = 0x43246ADD; // = 164.417...
我该如何做到这一点而不使用float:
uint8 result = 164;
uint32
中存储了一个浮点值吗?为什么你使用的是uint32
而不是在<stdint.h>
中定义的标准uint32_t
? - Keith Thompsonuint32
中如何表示?哪些位表示指数、尾数和符号,以及如何表示? - Keith Thompsonfloat
的字节序通常与uint32_t
相同,但未指定为如此。当然,整个float
格式不是C特定的。最好像binary32这样声明FP格式。 - chux - Reinstate Monica