7

Я пытался преобразовать число -441 в двоичное, но я действительно не знаю, как мне это сделать.

Сначала я преобразовал 441 в двоичный файл, который является: 110111001. Затем я должен принять комплимент этого числа: 001000110, а затем мне нужно было бы добавить один, который привел бы к: 001000111.

В упражнении говорится, что я должен дать двоичное представление в 10-битном и 16-битном коде, и поэтому я, хотя и мог бы просто поставить ноль перед числом, и все, но после долгих поисков я обнаружил, что должен поставить ОДИН перед номером, почему это так?

Как бы я мог преобразовать -441 в 16-битное число?

Спасибо.

2 ответа2

16

Вы запутались, потому что забыли, что должно быть что-то, что отличает положительные числа от отрицательных.

Допустим, вы хотите хранить неотрицательные числа в 8 битах.

  • 00000000 равно 0,
  • 00000001 равно 1,
  • 00000010 - это 2,
  • 00000011 - это 3,
  • 00000100 - это 4,
  • ...
  • 11111111 - это 255

Таким образом, вы можете хранить числа в диапазоне 0-255 на 8 бит. 255 = 28 - 1. (2 - основа двоичной системы, 8 - количество бит, 1 вычтено, потому что мы хотим считать 0 в)

Теперь предположим, что вы хотите хранить и отрицательные числа. Как мы можем этого достичь? Мы можем посвятить один бит для знака. Если этот бит равен 0 мы интерпретируем остальные 7 бит как положительное число, в противном случае как отрицательное число. Лучше всего использовать самый значимый бит для знака, потому что это облегчает некоторые операции.

  • Тривиальный подход: просто прочитайте число как есть:

    • 00000001 == 1 и 10000001 == -1
    • 01000010 == 66 и 11000010 == -66
    • 01111111 == 127 и 11111111 == -127
  • Дополнение единиц: для любого числа x отрицание его двоичного представления дает двоичное представление -x . Это означает, что:

    • 00000001 == 1 и 11111110 == -1
    • 01000010 == 66 и 10111101 == -66
    • 01111111 == 127 и 10000000 == -127
  • Дополнение к двум: для любого числа x отрицание его двоичного представления и добавление 1 дает двоичное представление -x . Это означает, что:

    • 00000001 == 1 и 11111111 == -1
    • 01000010 == 66 и 10111110 == -66
    • 01111111 == 127 и 1000001 == -127
    • 10000000 == -128

Почему два дополнения лучше?

  • Потому что у него самый широкий диапазон: -128 ... 127, а при тривиальном подходе и дополнении - -127 ... 127
  • Ноль хорошо определен:
    • В двух дополнениях только 00000000 - ноль
    • При тривиальном подходе и 00000000 и 10000000 равны нулю
    • В одном дополнении оба 00000000 и 11111111 равны нулю
  • Сложение и вычитание такие же, как и для чисел без знака, поэтому ЦП не нужны дополнительные инструкции для добавления чисел со знаком.

Обратите внимание, что если мы выделим самый значимый бит для знакового бита, то мы не сможем преобразовать число в двоичное, не зная, сколько бит нам понадобится. Например, у нас есть 4 бита, тогда число -5 в тривиальном подходе равно 1101 , на 7 битах это будет 1000101 . 0001101 (4-битный -5, дополненный нулями до 7-битной длины) на самом деле равен 13 (старший бит равен 0, поэтому он положительный).

Я не буду делать домашнее задание для вас, но я могу дать вам общие советы:

Чтобы преобразовать -x в N бит длиной, два представления дополнения:

  1. Конвертировать -x в двоичный файл, используя два дополнения.
  2. Левый блок дополняется нулями до N-1 длины.
  3. Добавьте бит отрицательного знака на левой стороне.

Я думаю, что вы можете понять остальное из этого ответа. Если у вас есть еще вопросы, оставьте комментарий.

0

Хорошо, после получения дополнения к двум, вам нужно добавить 0 в крайнем конце двоичного файла, чтобы сделать его 10-битной нотацией. Сложность в том, что вам нужно поставить бит со знаком, чтобы показать, что двоичный файл имеет отрицательное целое число, т.е. (1) 0001000111

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .