2012-04-11 53 views
4

我看specification爲DCPU-16,我無法理解與DIV指令溢出值的目的:DCPU-16除法指令

DIV A,B - 設置a到a/b,將O設置爲((a < < 16)/ b)& 0xffff。

有人可以在這裏解釋O的語義,它對於什麼有用?

+0

我認爲它比無用的更糟,'O'需要32/16位的分隔!將「O」設置爲餘數會更有用,並且使得多精度算術更容易。 – 2012-04-11 20:18:12

回答

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二進制)右移一位進入小數位。

2

((a<<16)/b)將爲您提供該部門的16位小數部分。

以10爲基數很容易看出:如果我們想找到5/3的前三個小數位數,我們可以移動5個位置(5000)上的5個位置,除以3,然後取最後三位數字。 5000/3是1666,所以5/3小數點後的前三位數是.666。


此操作,因爲「移動5個位數以上」相同「乘以10」,和乘法/除法是可交換的(順序可以圍繞被交換),所以(5 * 1000)/3 = (5/3) * 1000 = 1.6666... * 1000 = 1666.666...

換句話說,將5移到幾個數字後除以3與移位(5/3)幾個數字相同。