4

我正在查看 DCPU-16 的规范,但我无法理解使用 DIV 指令的溢出值的目的:

DIV a, b - 将 a 设置为 a/b,将 O 设置为 ((a<<16)/b)&0xffff。

任何人都可以在这里解释 O 的语义含义,它有什么用?

4

2 回答 2

6

看起来 O 给出了结果的小数部分(作为定点数)。例如,考虑 5 / 2:

a = 5 / 2 = 2 (integer part)
O = ((5 << 16) / 2) & 0xffff = (327680 / 2) & 0xffff = 32768

如果您将 O 视为 16 个二进制小数位,则这表示结果的 0.5 小数部分。

另一种看待它的方式是以位为单位的二进制结果是:

aaaaaaaaaaaaaaaa.OOOOOOOOOOOOOOOO

5 / 2 是

0000000000000010.1000000000000000

通过检查可以看出,该结果是 5(101 二进制)右移一位进入小数位。

于 2012-04-11T19:48:19.640 回答
2

((a<<16)/b)将为您提供除法的 16 位小数部分。

以 10 为底更容易看出:如果我们想找到 5/3 的前三个小数位,我们可以将 5 移到 (5000) 上的三个位置,然后除以 3,然后取最后三个整数位数。5000/3 是 1666,所以 5/3 小数点后的前三位是 0.666。


这是有效的,因为“将 5 移动一位数”与“乘以 10”相同,并且乘法/除法是可交换的(可以交换顺序),所以(5 * 1000) / 3= (5 / 3) * 1000= 1.6666... * 1000= 1666.666...

换句话说,将 5 移动几位并除以 3 与将 (5/3) 移动几位相同。

于 2012-04-11T19:49:46.517 回答