我正在通过仪表读取rs-232串行线路上的字符。由于校验和字节是正确的,我100%确定这些值都是正确的。令我困惑的一件事是代表压力值的4个字节返回-0.000000。这个负面的迹象似乎并不正确。这是一个提取的例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned char cmd[] = {
0x80, 0x00, 0x00, 0x00
};
float float_byte_join(unsigned char *from, int size)
{
float value;
value = 0;
unsigned char * p = (unsigned char *)&value;
int i, j;
for (i = 0, j = size - 1; i < size; i++, j--) {
p[j] = *from;
++from;
}
printf("value is %f\n", value);
return value;
}
int main(void)
{
float_byte_join(cmd, 4);
return 0;
}
// result:
value is -0.000000
知道为什么打印-0.000000而不是0.000000?这4个字符真的代表负数吗?我认为两个补充没有负面的0。
答案 0 :(得分:4)
两个补码整数没有负零,但IEEE浮点值 do 的负值为零,并且编码为80 00 00 00
(十六进制,大端,单精度)。因此,如果这确实是您从设备获得的字节序列,那么这就是正确的结果。
这篇以及许多其他奇怪的IEEE浮点数在论文What Every Computer Scientist Should Know About Floating Point中得到了解释和论证,由于你是一名计算机科学家,你应该阅读。
答案 1 :(得分:0)
将符号位(最高有效位)设置为1,指定负数,将其更改为0.
unsigned char cmd[] = {
0x00, 0x00, 0x00, 0x00
};
(但无论如何:-0.0f == 0.0f)