Запрос относительно двоичных чисел - PullRequest
0 голосов
/ 11 октября 2010

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

Consider the value “-64”. The eight bit two’s complement value for this number is
0C0h. The 16-bit equivalent of this number is 0FFC0h.

Я не могу понять эти два предложения.Кто-нибудь может показать мне, как комплемент восьми-битных 2 -64 равен 0c0h?А как 16-битный эквивалент равен 0ffc0h?Пожалуйста, покажите мне расчет, если это возможно.Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 11 октября 2010

Целые числа в ЦП представлены с использованием фиксированного числа двоичных цифр.Например, 64, выраженное в двоичном виде с использованием восьми битов, равно 01000000.

Обычно отрицательные числа выражаются в виде дополнения до двух.Чтобы получить дополнение двоичного числа двоичного числа, вы сначала вычисляете дополнение одного положительного числа (что означает, переверните все биты), а затем добавляете единицу.

Например, чтобы вычислить дополнение двоичного числа -64, начните с 64 в двоичном:

01000000 then flip all the bits to get one's complement
10111111 then add one, ignoring the final carry (i.e. overflow)
11000000

11000000 - это C0 в шестнадцатеричном формате.

Тот же процесс может быть выполнен с использованием 16-бит:

00000000 01000000 (64)
11111111 10111111 (one's complement of 64)
11111111 11000000 (one's complement of 64 plus one)

11111111 11000000 в шестнадцатеричном формате - это FFC0.

Причина, по которой дополнение к двум используется для отрицательных чисел, заключается в том, что он исключает особые случаи.Отрицательное число и положительное число могут обычно добавляться вместе, и правильный ответ будет результатом.Например, -1 в 8-битном двоичном дополнении равен 11111111.Добавление одного к этому корректно возвращает ноль (11111111 + 00000001 = 00000000), поскольку недостаточно битов для удержания переноса.

1 голос
/ 11 октября 2010

+ 64 =% 0100_0000
-64 =% 1011_1111 + 1 =% 1100_0000 = 0xC0
Когда вы берете 8-битный номер дополнения со знаком 2 и расширяете его до 16 битов, вы должны подписать расширение (скопировать бит знака во все новые биты HO)

Это составляет -64 =% 1111_1111_1100_0000 = 0xFFC0

1 голос
/ 11 октября 2010

Это может помочь изобразить отрицательное число как вычитание двух положительных чисел, таких как «0 - 64».

Ноль - это просто 00h в 8 битах.

Вычесть1, и вы получите FFh.

Вычтите 1 снова, и вы получите FEh.

Продолжайте эту модель еще 62 раза, и вы будете вC0h.

Попробуйте шаблон еще раз в 16 битах, помня, что вычитание одного из 0000h равно FFFFh.

0 голосов
/ 11 октября 2010

Представьте себе машину, которая использует бесконечное число битов для целых чисел. Предположим, что один вычитается из числа, все крайние правые биты которого равны нулю, а следующий бит равен «1». Все крайние правые нули 'k' станут единицами, а следующий бит станет нулем.

Теперь предположим, что для некоторого «k» самые правые биты «k» равны нулю, а следующий бит неизвестен, но где-то известно, что где-то есть «1». В этом сценарии, даже не зная старших бит, все равно известно, что младшие биты k должны перейти от нуля до 1.

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

Кстати, обратите внимание, что здесь работает общая формула для геометрического ряда: сумма = 0..inf равна 1 / (1-а). Обычно используется со значениями «а», такими как 1/2 (например, сумма 1 + 1/2 + 1/4 + 1/8 и т. Д. Равна 2), он «работает» для значения 2 (получая итоговое значение, равное -1 ).

Конечно, компьютеры не могут хранить бесконечное число единиц. Поэтому существует соглашение, согласно которому старший бит в сохраненном представлении числа фактически представляет состояние всех битов за пределами.

0 голосов
/ 11 октября 2010

Я собираюсь использовать индексы для баз, а не синтаксис любого языка программирования.Во-первых, в положительных числах

+ 64 10 = + 40 16

Представление отрицательного числа в виде дополнения до двух является побитовым дополнениемэтого числа плюс 1. В 8 битах

- (40 16 ) = ~ (40 16 ) + 1 = BF 16 + 1 = C0 16

, как говорится в вашей книге.Чтобы получить 16-битное представление, вы копируете старший бит 8-битного представления во все старшие биты (это называется расширение знака ):

40 16 = 0040 16
C0 16 = FFC0 16

Вы должны знать из контекста, подходит ли расширение знака или расширение нуля,C0 16 , без контекста, является неоднозначным: это может быть либо -64 10 , либо + 192 10 .Если последнее, то оно должно быть расширено до нуля до 00C0 16 , а не расширено до FFC0 16 .

...