我需要在不同平台(有些是计算机,有些是电子板)之间传递32位浮点值以进行数据采集。 在我的通信协议中,我想使用NAN浮动来传达错误。问题是,有很多NAN,我想使用一个特别是0x7FA00000。
所以,我想要一个我定义的标题:
#define DAQ_SYSTEM_ERROR (0x7FA00000)
问题是,这是一个有效的32位整数并执行:
float value = DAQ_SYSTEM_ERROR;
没有产生预期的结果。
有没有办法在没有太多代码的情况下点对此?特别是,有没有办法使用reinterpret cast指令给编译器我想要的东西?我认为它应该是可能的,但我无法管理它。
代码必须适用于C,C ++,Objective-C和Swift。
修改
感谢您的评论。我确实只对一个价值感兴趣。想法是获取浮点数,然后检查NAN(定义为0x7FA00000
)以确定检索的值是否是有效的测量值(并且应该被记录)或者是否在某处发生错误,在这种情况下值应该被丢弃并举起一面旗帜。关于"发送"平台,某个浮点值会影响0x7FA00000
值。在接收平台上,字节首先被解码,与0x7FA00000
进行比较,然后如果一切顺利,则填充在浮点数中。
答案 0 :(得分:1)
无法在编译时指定要转换为float的精确位模式。 ((float)0x7FA00000)将变为2141192192.0。将特定位转换为浮点值的唯一方法是在运行时通过指针:
float fval;
uint32_t fbits = 0x7FA00000;
. . .
memmove(&fval, &fbits, sizeof float);
大多数编译器也会接受:
*((uint32_t *)(& fval)) = fbits;
虽然memmove()更便携。