我正在使用AR Drone SDK对无人机进行编程。在文档中,是这样说的:
数字-0.8作为32位字存储在内存中,其值为BF4CCCCD(16)。这个32位字可以被视为持有32位整数值-1085485875(10)。所以要发送的命令将是AT*PCMD=xx,xx,-105485875,xx,xx。
对于二进制转换的十进制表示,它们是如何得出-105485875的?这对我来说毫无意义。使用此页面: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).
文件称其-10854485875(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运算符应用于二进制,它就会产生正确的数字。我的问题是,为什么需要应用这一点?完成此操作后,如果第一位是零而不是一,则必须确定它是否为负。这有什么意义?
-0.8=-0.111001100110011001100 1100 1100 1100 11001100 1100 110011001100…(空格在第24位和第25位之间--第25位为舍入位)。这四舍五入到24位,即0.11001100110011001101。以下是它在IEEE单精度格式中的外观:
sign biased exponent trailing 23-bits of mantissa
/ / /
1 01111110 10011001100110011001101
这是1011111101001100110011001101,或十六进制的BF4CCCCD。如果你把它看作是一个二对一个整数的补码,它就是-1085448575。