0x0B - 0x74 = 0x0B + (-0x74), как мы знаем из начальной школы.
дополнение к двойке говорит нам, что
-0x74 = (~ 0x74) + 1.
так что процессор решает это так:
1
00001011
+ 10001011
============
закончите заполнять его, как в начальной школе, но проще, чем в базе 2.
000010111
00001011
+ 10001011
============
10010111
перенос и перенос совпадения мсбит, поэтому ответ подходит. 0x97, который
- (0x68 + 1) = -0x69.
Также обратите внимание, что если бы это было 0x00B - 0x074, оно все еще работает
1
000000001011
+ 111110001011
===============
результат 0xF97, который равен -0x069. красота двойного дополнения.
(для отрицания числа в двух дополняют один способ сделать это инвертировать (дополняют) и добавить один)
вам вообще не нужно конвертировать базы, вы можете делать математику с базовым 16 так же легко, как базовые 10 или 2. Если мы хотим вычесть числа из начальной школы, мы должны взять наибольшее из меньшего
74
- 0B
======
b больше 4, поэтому мы должны заимствовать
1
64
- 0B
======
9
0x14 - b = 0x9.
1
64
- 0B
======
69
0x6 - 0x0 = 0x6.
потому что мы должны были перевернуть числа, потому что 0x74 больше, чем 0x0b, тогда мы отрицаем результат -0x69.
Без магии. элементарная математика.