DCPU-16 DIV指令

时间:2012-04-11 19:32:40

标签: assembly dcpu-16

我正在查看DCPU-16的specification,我无法通过DIV指令理解溢出值的用途:

  

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

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

2 个答案:

答案 0 :(得分: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二进制)右移一位到小数位。

答案 1 :(得分:2)

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

在基数10中更容易看到:如果我们想要找到前五个小数位,例如5/3,我们可以移动5个位置超过(5000),将其除以3,然后取最后三位数。 5000/3是1666,所以5/3小数点后的前三位是.666。


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

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