【发布时间】:2012-11-18 01:03:27
【问题描述】:
我正在使用 AR Drone SDK 对无人机进行编程。在文档中,是这样说的:
数字 -0.8 作为 32 位字存储在内存中,其值为 BF4CCCCD(16),根据 IEEE-754 格式。这个 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 运算符应用于二进制,它就会产生正确的数字。我的问题是,为什么需要应用这个?完成此操作后,如果第一位是零而不是一,则必须确定其是否为负。这有什么意义?
【问题讨论】:
-
尝试舍入尾数而不是截断尾数,并尝试将结果解释为二进制补码。
-
@Bovinedragon 当你说我要截断尾数时我不明白,我在哪里做这个?你能给我更多关于将结果解释为二进制补码的信息吗? .8 变成了 1100 的重复二进制模式,所以我将它重复到 22 位,但是由于我从小数点左边删除了 1,然后我在最后用另一个 0 填充它。我在哪里截断它?我只是把符号、指数和尾数放在一起,最后的结果对吗?至于这些数字是如何存储在内存中的,对吗?
-
我只是不明白他们从哪里得到 -1085485875。
-
二进制补码是计算机通常用来存储整数的二进制格式。您可能可以在网上找到一些资源,这些资源可以比我更好地解释它是如何工作的。通过查看数字的按位,您走在正确的轨道上。
-
四舍五入,你得到的尾数后面的几位数字是1100,所以尾数应该四舍五入到10011001100110011001101。
标签: floating-point binary hex base-conversion ar.drone