我正在练习十六进制减法,并且我似乎陷入了这个问题:
0B -74
有人可以解释如何执行此计算吗?十六进制的答案是-69,但我似乎不明白为什么。我应该尝试将其转换为二进制数还是以10为基数的数字来帮助解决此问题?
答案 0 :(得分:2)
0x0B-0x74 = 0x0B +(-0x74),我们从小学就知道。
二进制补码告诉我们
-0x74 =(〜0x74)+ 1。
因此,CPU可以通过以下方式解决它:
1
00001011
+ 10001011
============
完成它的填充,就像小学一样,但是因为它是基数2而更容易。
000010111
00001011
+ 10001011
============
10010111
进位和进位msbit匹配,因此答案合适。 0x97这是 -(0x68 + 1)= -0x69。
还请注意,如果它是0x00B-0x074,它仍然有效
1
000000001011
+ 111110001011
===============
结果为0xF97,即-0x069。完美的互补。
(将数字取二的补码取反的一种方法是取反(一个补码)并加一个)
您不必完全转换基数,就可以像以10或2为基数一样轻松地进行16基数学运算。如果我们想从年级中减去数字,则必须从较小的数中取最大数。
74
- 0B
======
b大于4,所以我们必须借用
1
64
- 0B
======
9
0x14-b = 0x9。
1
64
- 0B
======
69
0x6-0x0 = 0x6。
因为我们必须翻转数字,因为0x74大于0x0b,所以我们将结果-0x69取反。
没有魔术。小学数学。
答案 1 :(得分:1)
0x0B-0x74 = 11-116 = -105(-0x69)
在十进制11-116中,第二个值更大,所以我改为-(116-11)翻转值=-(105)= -105。
在hexa中,您可以执行相同的-(0x74-0x0B),现在对于第一个(最低有效)数字0x4-0xB再次太多,因此借用一个=> 0x14-0x0B(20-11)= 9(一个找到数字)。现在第二个数字:0x7-0x0-借位= 0x7-0x1 = 0x6 =>全值0x69,正等待结果的符号翻转= -0x69
并验证结果:
-0x69 + 0x74 = 0x0B(注意-0x9 + 0x4实际上是0xB(11),因为您是从4乘9向下,即3、2、1、0(-4完成),然后是F (!),E,D,C,B(总和为-5 = -9)。如果您习惯于使用小数,则可能始终难以记住“以16为底”。>