Двойное слово длиной 2 дополняет представление двоичного числа?

Выполняю мое первое задание в Ассемблере, и этот вопрос задан...

1. Найдите представление дополнения длины двойного слова 2 каждого из следующих десятичных чисел. (Шаги для получения ваших результатов должны отображаться, в противном случае вы получите ноль очков.)

-100

b -55555

У меня очень иностранный профессор, которого я совершенно не понимаю, поэтому мне нужна помощь. Таким образом, двойное слово будет 32 бита, что сделает...

A) 0000|0000|0000|0000|0000|0001|0000|0000 (1 в начале для негатива |0001 за 1 |0000 за 0 |0000 для 0 | ведущие 0 для наполнителя.

б) 1000|0000|0000|0101|0101|0101|0101|0101 (1 в начале для негатива | 00000000 для наполнителя 0 х | остальное 0101 на 5 х.

Учитывая, что это как-то правильно, дополнение 2 будет..

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

2 ответа

Решение

Путь с трека. Помните, что они были десятичными числами, вы не можете просто притвориться, что они шестнадцатеричные (и использовать кусочки), и "просто поставить 1 в начале" примерно так далеко от дополнения до двух, как вы можете быть.

Итак, начнем с самого начала, конвертируем 100 и 55555 в двоичный код. Вычтите наибольшую степень двух, которые войдут в него, установите соответствующий бит в 1. Итак, для 100:

100 - 64 = 36,  set bit 1000000
 36 - 32 =  4,  set bit  100000
  4 -  4 =  0,  set bit     100
                        ------- +
                        1100100

Или же 0x64 в шестнадцатеричном формате. 55555 просто больше того же самого.

Вы, вероятно, узнали (или должны были узнать) личность -x = ~x + 1Используя это, просто отрицать 100 и 55555. Возьмите двоичное представление, настолько широкое, насколько вы хотите, чтобы результат был (32 бита), поэтому

0000 0000 0000 0000 0000 0000 0110 0100

Инвертировать все биты:

1111 1111 1111 1111 1111 1111 1001 1011

Добавить 1:

1111 1111 1111 1111 1111 1111 1001 1100

Или же 0xFFFFFF9C в шестнадцатеричном формате.

Я очень хочу, чтобы кто-то объяснил мне это в более простых терминах давным-давно.

Как работает "Дополнение двоих"...

Шаг первый: превратить число в двоичную строку из 1 и 0 бит

Шаг второй: переверните все эти биты

Шаг третий: добавьте один к этому результату

Два быстрых примера, в 8-битных целых

  Decimal Number: 37

  Make it Hex: 025h

  Make it Binary: 0010 0101

  Flip those bits: 1101 1010

  Add binary one:  0000 0001

  Get this result: 1101 1011

  That is the 8 bit representation of the integer, negative 37 (decimal) 




  Example, the other way

  Decimal Number: -41  (that's negative 41)

  Make it Hex: 0D7h

  Make it Binary: 1101 0111

  Flip those bits: 0010 1000

  Add binary one:  0000 0001

  Get this result: 0010 1001

  That is the 8 bit representation of the integer, 41 decimal (i.e., positive 41) 

Кстати, в качестве упражнения вы можете получить одно и то же значение с двумя комплиментами в течение всего дня, а значение - просто переключаться между отрицательным и положительным числом.

Что касается 16-битных, 32-битных и 64-битных чисел, вы просто расширяете их до старших бит.

Другие вопросы по тегам