【发布时间】:2012-04-11 19:32:39
【问题描述】:
我正在查看 DCPU-16 的 specification,但我无法理解 DIV 指令溢出值的用途:
DIV a, b - 将 a 设置为 a/b,将 O 设置为 ((a
谁能在这里解释一下O的语义,它有什么用处?
【问题讨论】:
-
我认为它比无用更糟糕,'O' 需要 32/16 位除法!将“O”设置为余数会更有用,并使多精度算术更容易。
我正在查看 DCPU-16 的 specification,但我无法理解 DIV 指令溢出值的用途:
DIV a, b - 将 a 设置为 a/b,将 O 设置为 ((a
谁能在这里解释一下O的语义,它有什么用处?
【问题讨论】:
看起来 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 二进制)右移一位进入小数位。
【讨论】:
((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) 移动几位相同。
【讨论】: