Инструкция DCPU-16 DIV
Я смотрю на спецификацию для DCPU-16, и у меня возникают проблемы с пониманием цели значения переполнения с помощью инструкции DIV:
DIV a, b - устанавливает a в a/b, устанавливает O в ((a<<16)/b)&0xffff.
Кто-нибудь может объяснить семантическое значение O здесь, для чего это было бы полезно?
2 ответа
Похоже, 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 двоичный) вправо на один бит в дробные биты.
((a<<16)/b)
даст вам 16-битную дробную часть деления.
Это проще увидеть в базе 10: если мы хотим найти первые три дробные цифры, скажем, 5/3, мы можем переместить 5 на три позиции (5000), разделить их на 3, а затем взять последние три целых цифры. 5000/3 - 1666, поэтому первые три цифры после десятичной дроби 5/3 - 0,666.
Это работает, потому что "перемещение 5 на одну цифру" аналогично "умножению на 10", а умножение / деление являются коммутативными (порядок можно поменять местами), поэтому (5 * 1000) / 3
знак равно (5 / 3) * 1000
знак равно 1.6666... * 1000
знак равно 1666.666...
,
Другими словами, сдвиг 5 на несколько цифр и деление на 3 - это то же самое, что сдвиг (5/3) на пару цифр.