我正在查看DCPU-16的specification,我无法通过DIV指令理解溢出值的用途:
DIV a,b - 将a设置为a / b,将O设置为((a <&lt; 16)/ b)&amp; 0xffff。
任何人都可以在这里解释O的语义,它对什么有用?
答案 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)相差几位。