我正在查看 DCPU-16 的规范,但我无法理解使用 DIV 指令的溢出值的目的:
DIV a, b - 将 a 设置为 a/b,将 O 设置为 ((a<<16)/b)&0xffff。
任何人都可以在这里解释 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) 移动几位相同。