Я предполагаю, что два дополнительных 32-битных целых числа и операторы работают так же, как в C #.
Как сделать конвертацию?
fixed / 65536.0
правильно и легко понять.
(fixed >> 16) + (fixed & 0xffff) / 65536.0
Эквивалентно приведенному выше для натуральных чисел, но медленнее и труднее для чтения. Вы в основном используете закон распределения, чтобы разделить одно деление на два, и написать первое с использованием сдвига битов.
Для отрицательных целых чисел fixed & 0xffff
не дает вам дробных битов, поэтому это не правильно для отрицательных чисел.
Посмотрите на необработанное целое число -1
, которое должно отображаться на -1/65536
. Этот код возвращает 65535/65536
вместо.
В зависимости от вашего компилятора это может быть быстрее:
fixed * (1/65536.0)
Но я полагаю, что большинство современных компиляторов уже выполняют эту оптимизацию.
Как в любом случае выглядит подписанная фиксированная точка "-0.5" в памяти?
Обращение преобразования дает нам:
RoundToInt(float*65536)
Установка float=-0.5
дает нам: -32768
.