Двойное слово длиной 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-битных чисел, вы просто расширяете их до старших бит.