c - понимание битовой модели с фиксированной точкой - PullRequest
3 голосов
/ 30 сентября 2019

Итак, я изучаю двоичные значения и пытаюсь понять, как вычислить отрицательную версию числа, используя битовую модель с фиксированной запятой.

В моем учебнике написано 000111.01 = 7.25, которое японять. Но он говорит мне, что -7.25 - это 111000.11, и я не понимаю, как это возможно.

Я знаю, что он использует правило дополнения до двух, где он переворачивает все биты и добавляет 1 в конце. Но если бы я сделал расчет: (1 * 2 ^ 5) + (1 * 2 ^ 4) + (1 & 2 ^ 3) + 0 + 0 + 0 + (1 * 2 ^ -1) + (1 * 2^ -2) это дает мне 56,75.

Я пытался искать учебники в Интернете, но все еще не могу понять, почему -7,25 - это 111000,11. Я был бы признателен, если бы кто-то мог объяснить математический процесс получения -7,25.

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

У вас есть 8-битное представление с фиксированной запятой формата 6Q2 со знаком с разрешением 2 -2 (или 0,25). Вы можете взглянуть на это чисто арифметически:

Значение int8_t для 11100011 равно -29, но с фиксированным масштабом точки -29 x 0,25 = -7,25.

Или затем вусловия двоичных значений комплимента 2, которые для 8-битового целого числа :

-2 7 (-128 10 )2 6 (64 10 )2 5 (32 10 )2 4 (16 10 )2 3 (8 10 )2 2 (4 10 )2 1 (2 10 )2 0 (1 10 )

, но фиксированная точка Q2 смещает эти значения мест на 2 следующим образом:

-2 5 (-32 10 )2 4 (16 10 )2 3 (8 10 )2 2 (4 10 )2 1 (2 10 )2 0 (1 10 )2 -1 (0,5 10 )2 -2 (0,25 10 )

1 голос
/ 01 октября 2019

Я знаю, что он использует правило дополнения до двух, где он переворачивает все биты и добавляет 1 в конце.

Под масштабным коэффициентом, где двоичныйточка сдвинута влево на два места, вам нужно изменить правило: перевернуть все биты и добавить 1/4 или 0,01.

000111.01 = 7.25

Перевернуть все биты:

111000.10

Добавить 0.01:

111000.11

Все, что было сделано в соответствии с соглашением о фиксированной точке, это переместить двоичную точку. Если умножить 111000.11 на 4 (и обрезать до 8 бит), мы получим 100011.00. И это -29. Ровно в четыре раза -7,25. Поэтому, если мы разделим 29 на 4, процесс должен развернуться и перейти от 100011.00 к 111000.11. Это просто арифметическое смещение вправо . Процесс расширение знака заполняет 1 сверху, а остальные биты просто сдвигаются вниз. Мы получаем .11.

Конечно, здесь, когда я говорю «делить на 4», я имею в виду деление на обычное целое число 4, а не на масштабированное 4 = 100,00. При фиксированной точке мы можем использовать обычное, не скорректированное умножение и деление, чтобы объединить фиксированный операнд с обычным операндом. FIXED x INT -> FIXED просто использует обычное умножение. FIXED + FIXED -> FIXED использует регулярное добавление. ИСПРАВЛЕНО x ИСПРАВЛЕНО -> ИСПРАВЛЕНО требует перенормировки. FIXED + INT -> FIXED требует преобразования INT в FIXED.

...