Использование двух дополнений для представления отрицательных значений имеет преимущество, заключающееся в том, что вычитание и добавление одинаковы. В вашем случае вы можете думать о 12 - 7
как 12 + (-7)
. Следовательно, вам нужно только найти представление дополнений двух -7 и добавить его в +12:
12 001100
-7 111001 -- to get this, invert all bits of 7 (000111) and add 1
----------
5 1000101
. Затем отбросить перенос (указывает на переполнение), и у вас есть результат: 000101
, который равен до 5, как ожидалось.
Для вашего примера из -15 + 2
просто следуйте той же процедуре, чтобы получить дополнительное представление двух -15:
15 001111
110000 -- inverted bits
110001 -- add 1
. Теперь добавьте как обычный:
-15 110001
2 000010
-----------
res 110011
Чтобы убедиться, что res
действительно равно -13, вы можете видеть, что он отрицательный (набор MSB). Для величины, конвертировать в положительную (инвертировать биты, добавить 1):
res 110011
001100 -- inverted bits
001101 -- add 1
Следовательно, величина равна 13, как ожидалось.
Разобрался. Я использовал loggerKey {} в качестве ключа, тогда как фактический ключ - log.loggerKey {}. Мне пришлось импортировать журнал, и тогда это сработало.