Формирование 16-битного дополнения со знаком 2 для различных десятичных значений - PullRequest
0 голосов
/ 16 мая 2019

Я пытался преобразовать различные значения, в основном десятичные, в формат дополнения 2. Кажется, у меня проблемы с ними, особенно с дробями.

Допустим, у меня есть целочисленное значение L = 2 ^ 16 - 46, и я хочу преобразовать его в дополнение к 2.

L = 65490, что, кажется, дает мне 1111111111010010 в двоичном виде. Затем я преобразовал его в дополнение 2, поменяв местами биты и добавив единицу, получив таким образом L (2) = 0000000000101110.

Теперь давайте предположим, что у меня есть десятичная дробь с дробями, например, K = 0,2522429. Преобразуя это в двоичный файл, мы получаем 0.01000000_10010011. Снова конвертируя с помощью дополнения до 2, я получаю 0.10111111_01101101, что кажется правильным.

Но что мне делать, если десятичное число не совпадает с 16-разрядным? Или если я хочу 2-е дополнение для операции K / 16?

Я бы получил K = 0,01576518125, что привело бы к 0,00000100_00001001_0011 в двоичном виде. Как мы видим, теперь у нас есть 20 битов вместо 6, и дополнение 2 будет 0,1111_10111111_01101101. Как мне получить 16-битный результат для операции K / 16 и, например, различные варианты, такие как -K / 8, K / 4, -K / 2?

1 Ответ

0 голосов
/ 16 мая 2019

Допустим, у меня есть целочисленное значение L = 2 ^ 16 - 46, и я хочу преобразовать его в дополнение к 2.

Если вы хотите закодировать число N в дополнении 2, вы должны указать -2 ^ 15 & le; N & le; 2 ^ 15-1, и вы не можете кодировать число 2 ^ 16-46 как положительное число в дополнении 2 к 16 бит Точнее, 2 ^ 16-46 будет (положительным) числом, двоичный код которого будет использоваться для представления в 2-х C на 16 битах отрицательного числа -46.

Теперь давайте предположим, что у меня есть десятичная дробь с дробями, например, K = 0,2522429. Преобразуя это в двоичный файл, мы получаем 0.01000000_10010011. Снова конвертируя с помощью дополнения до 2, я получаю 0.10111111_01101101, что кажется правильным.

Не совсем. C 2 из N = 0,01000000_10010011 равен N '= 1,10111111_01101101 (или 16 битам: N = 0,01000000_1001001 и N' = 1,10111111_0110110). Исторически, дробные числа, где первое применение 2-х C и 2-х C из N - это число N ', такое как N + N' = 2. Другими словами, N '- это число, которое нужно добавить к N, чтобы получить 2, отсюда и название дополнения до двух.

Но что мне делать, если десятичное число не совпадает с 16-разрядным?

Я не очень понимаю ваш вопрос. K = 0,2522429 уже нельзя кодировать точно на 16 битах и ​​0,01000000_10010011 b = 0,252243042, и, как это часто бывает с дробными числами, вы можете иметь только двоичное приближение этих чисел. Десятичные дробные числа выражаются в виде сумм отрицательных степеней 10, и большую часть времени их значение не может быть выражено точно в виде сумм отрицательных степеней 2 (поскольку 1/3 не может быть выражено точно в виде конечной суммы отрицательных степеней 10).

Так что, если вы хотите закодировать дробное число в 16 бит, вы найдете двоичное приближение числа и сохраните только 16 бит.

Или, если я хочу 2 дополнения для операции K / 16?

Деление на 16 - смещение вправо на 4. Для чисел 2 с C смещение должно быть арифметическим, а MSB (знаковый бит) должен дублироваться. Это гарантирует, что это эквивалентно делению на 4. Следовательно, если N '= 1.10111111_01101101, N' / 4 = 1.1111_10111111_01101101. Конечно, число битов> 16, и вы должны оставить только 16 старших значащих битов N '= 1,11111011_1111011, что равно -0,015777588, что является приблизительным значением результата.

Но связано с делением и одинаково для любого числа в любой базе и любой системе кодирования с конечным числом цифр. Например, 53 = 00110101 и закодировано как целое число 53/16 = 00000011 или 0,12325621 / 100 = 0,00123156, если вы держите только 8 цифр справа от точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...