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の2進数の小数桁と見なす場合、これは結果の0.5の小数部分を表します。
それを見る別の方法は、ビット単位のバイナリ結果です。
aaaaaaaaaaaaaaaa.OOOOOOOOOOOOOOOO
5/2は
0000000000000010.1000000000000000
検査でわかるように、その結果は5(101バイナリ)が1ビット右に小数ビットにシフトされます。
((a<<16)/b)
除算の16ビットの小数部分が得られます。
基数10で見やすくなります。たとえば、5/3の最初の3桁の小数を検索する場合は、5を(5000)上に3桁移動し、それを3で割って、最後の3つを合計します。数字。5000/3は1666であるため、5/3の小数点以下の最初の3桁は.666です。
これが機能するのは、「5を1桁上に移動する」は、「10を掛ける」と同じであり、掛け算/割り算は可換であるため(順序を入れ替えることができる)、(5 * 1000) / 3
===です。(5 / 3) * 1000
1.6666... * 1000
1666.666...
つまり、5を数桁シフトして3で除算することは、(5/3)を数桁シフトすることと同じです。