Мне трудно понять представления с фиксированной точкой. Когда у меня есть тип данных без знака (C ++), и я хочу работать с этим числом, как если бы оно было с фиксированной запятой, мне нужно выполнить определенное количество битовых манипуляций, которые мне не понятны.
Итак, допустим, я хочу, чтобы мой номер, который был без знака и мог быть максимум 255 (8-битное число), был представлен в U4.4 или U12.8 или S13.8 или в любой другой записи (U — без знака, S — со знаком, и он приходит под вопросом когда у меня номер int). По сути, я расширяю (или я надеюсь, что я) число, работаю над ним, а затем возвращаю его в предыдущее состояние.
Как я могу это сделать?
Может кто-нибудь поделиться ссылкой, где я могу найти что-то тесно связанное с этой темой. Я искал три часа, и все, что я нашел, это общие объяснения арифметики с фиксированной запятой, ничего очень практичного.
Спасибо
Он говорит вам, сколько битов используется для каждой стороны десятичной точки.
Возьмите простой пример. 2 байта, 16 бит.
Это легко может быть U8.8. Таким образом, старший байт является частью «целого числа», а младший байт — частью «дроби».
Итак, давайте сделаем это немного проще в качестве объяснения.
Рассмотрим двоично-десятичный код Вот где вы кодируете десятичные числа в полубайты байтов, каждый байт состоит из 2 цифр. Каждый грызун представляет собой десятичную цифру, поэтому 1001 0010 — это «92». С двумя байтами 1001 0010 0100 0111 равен 9287.
Итак, вы можете видеть, как без дробей 16 битов могут представлять от 0000 до 9999. Используя ваши нотации, это может быть U16.0.
Теперь вы можете видеть, логически ли мы ставим десятичную точку в середине, теперь у нас может быть от 00.00 до 99.99 или U8.8.
Основной битовый шаблон одинаков, все дело в том, где вы логически ставите десятичную точку.
Теперь, в этом примере, вы увидели десятичную точку между десятичными цифрами.
Если вы используете двоичное представление, то «десятичная» точка находится между двоичными цифрами.
Итак, U8.8 нас 11111111. 11111111
U12.4 11111111 1111.1111
,
S vs U говорит вам о бите Знака. Таким образом, вместо U8.8 у вас будет S7.8 S1111111. 11111111
,
Когда у вас есть числа, которые представлены аналогично, тогда это просто двоичная математика, как и любое другое число (например, целое число). Когда вы конвертируете число в ascii или объединяете его с другими представлениями, вам нужно перемещаться.
Например. Чтобы добавить U8.8 к U12.4, вам необходимо преобразовать U8.8 в U12.4 перед выполнением математики.
Так, 11111111. 11111111
просто нужно сместить вправо 4 места, чтобы стать 00001111 1111.1111
, Тогда вы можете работать с двумя номерами 12.4, как обычно. Вы заметите, что во время конвертации вы теряете точность числа 8,8. Это известно как «неудача». Вы также можете поднять оба числа до более высокого представления, есть всевозможные варианты.
Других решений пока нет …