2

我正在使用 AR Drone SDK 对无人机进行编程。在文档中,是这样说的:

根据 IEEE-754 格式,数字 -0.8 作为 32 位字存储在内存中,其值为 BF4CCCCD(16)。这个 32 位字可以认为是保存 32 位整数值 -1085485875(10)。所以要发送的命令是 AT*PCMD=xx,xx,-1085485875,xx,xx。

对于二进制转换的十进制表示,它们如何到达 -1085485875?这对我来说没有意义。使用此页面: http: //kipirvine.com/asm/workbook/floating_tut.htm和此页面: http: //www.madirish.net/240和此页面http://cs.furman.edu/digitaldomain/more /ch6/dec_frac_to_bin.htm,这就是我想出的:

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).

文档说它的 -1085485875 (10) 和 BF4CCCCD (16)

我在这里做错了什么???

谢谢。

编辑:

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

var buffer = new Buffer(4);
buffer.writeFloatBE(-0.8, 0);
return -~parseInt(buffer.toString('hex'), 16) - 1;

根据文档,我得到了正确的结果。当我把它写出来时,我只是不明白我做错了什么。我想了解发生了什么。非常感谢任何帮助。

谢谢。

更新:

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

4

1 回答 1

0

-0.8 = -0.110011001100110011001100 11001100110011001100110011001100110011...(空格在位 24 和 25 之间——位 25 是舍入位)。这四舍五入为 24 位,为 0.110011001100110011001101。以下是它在 IEEE 单精度格式中的外观:

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

那是 10111111010011001100110011001101,或十六进制的 BF4CCCCD。如果您将其视为整数的二进制补码,则为 -1085485875。

于 2012-11-18T04:50:57.960 回答