2012-04-11 1 views
4

Я смотрю на specification для DCPU-16 и у меня возникают проблемы с пониманием цели переполненные значения с инструкцией DIV:DCPU-16 инструкция DIV

ДИВ а, б - наборы a до a/b, устанавливает O в ((a < < 16)/b) & 0xffff.

Может кто-нибудь объяснить семантическое значение O здесь, для чего это было бы полезно?

+0

Я бы сказал, что это хуже, чем бесполезно, с 'O', требующим 32/16-битного деления! Установка «O» на оставшуюся часть была бы более полезной и упростила бы арифметику с несколькими точками. –

ответ

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), разделите их на 3, затем возьмите последние три целых цифры. 5000/3 - 1666, поэтому первые три цифры после десятичного числа 5/3 равны .666.


Это работает, потому что «перемещение 5 одну цифру над» такой же, как «умножения на 10», и умножение/деление коммутируют (порядок можно поменять местами вокруг), поэтому (5 * 1000)/3 = (5/3) * 1000 = 1.6666... * 1000 = 1666.666... ,

Другими словами, сдвиг 5 на несколько цифр и деление на 3 совпадает с сдвигом (5/3) на пару цифр.