Floating point 负浮点到二进制转换

Floating point 负浮点到二进制转换,floating-point,binary,hex,base-conversion,ar.drone,Floating Point,Binary,Hex,Base Conversion,Ar.drone,我正在使用AR无人机SDK对无人机进行编程。在文件中,is说: 数字-0.8作为32位字存储在内存中,其值为 BF4CCCCD(16),符合IEEE-754格式。这个32位字可以 被视为持有32位整数值-1085485875(10)。所以 要发送的命令将位于*PCMD=xx,xx,-1085485875,xx,xx 对于二进制转换的十进制表示,它们是如何达到-1085485875的?这对我来说没有意义。使用这个页面:和这个页面:和这个页面,这就是我想到的: decimal value = -0.

我正在使用AR无人机SDK对无人机进行编程。在文件中,is说:

数字-0.8作为32位字存储在内存中,其值为 BF4CCCCD(16),符合IEEE-754格式。这个32位字可以 被视为持有32位整数值-1085485875(10)。所以 要发送的命令将位于*PCMD=xx,xx,-1085485875,xx,xx

对于二进制转换的十进制表示,它们是如何达到-1085485875的?这对我来说没有意义。使用这个页面:和这个页面:和这个页面,这就是我想到的:

decimal value = -0.8

binary value of decimal (-0.8) = -.11001100110011001100110

biased exponent (move above decimal over once to right) = 127 - 1 = 126 = 01111110

sign, exponent, mantissa (mantissa: drop off the 1 to left of decimal point, pad to 23) = 1 01111110 10011001100110011001100

10111111010011001100110011001100 = 3209481420 (10) BF4CCCCC (16).
文件称its-1085485875(10)和BF4CCCCD(16)

我做错了什么

谢谢

编辑:

由于我正在使用node/js编写AR无人机应用程序,如果我使用这些node.js函数:

var buffer = new Buffer(4);
buffer.writeFloatBE(-0.8, 0);
return -~parseInt(buffer.toString('hex'), 16) - 1;
根据文档,我得到了正确的结果。我只是不明白我做错了什么,当我把它写出来的时候。我想知道发生了什么事。非常感谢您的帮助

谢谢

更新:


因此,我发现(从上面的javascript代码中)如果我首先对二进制应用按位NOT运算符,它将生成正确的数字。我的问题是,为什么需要应用这一点?完成此操作后,您必须确定其是否为负,如果第一位是零而不是一。这有什么意义?

-0.8=-0.110011。。。(空格在第24位和第25位之间——第25位是舍入位)。这四舍五入到24位为0.11001。以下是IEEE单精度格式的外观:

sign  biased exponent    trailing 23-bits of mantissa
 \/        \/                      \/
 1      01111110         10011001100110011001101

这是10111111010011001,或十六进制的BF4CCCCD。如果您将其视为2的补码,则为-1085485875。

尝试将尾数四舍五入,而不是仅截断尾数,并尝试将结果解释为2的补码。@Bovinedagon我不明白您说我截断尾数,我在哪里这样做?你能给我多一点关于把结果解释成2的补码的信息吗?8变成了1100的重复二进制模式,所以我重复了它到22位,但是因为我从小数点左边去掉了1,所以我在最后用另一个0填充它。我在哪里截断它呢?我只是把符号、指数和尾数放在一起,这就是最终的结果,对吗?至于这些数字是如何存储在内存中的,对吗?我只是不明白它们是从哪里得到-1085485875的。2的补码是计算机通常用来存储整数的二进制格式。你可能会在网上找到一些比我更好的资源来解释它的工作原理。通过查看数字的按位not,您是在正确的轨道上。至于舍入,您得到的尾数后的下几个数字将是1100,因此尾数应舍入到10011001。