Допустим, у меня есть целочисленное значение 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 цифр справа от точки.