【发布时间】:2019-01-13 15:25:03
【问题描述】:
我正在练习十六进制减法,我似乎陷入了这个问题:
0B - 74
有人能解释一下如何执行这个计算吗?十六进制答案是 -69 但我似乎不明白为什么。我应该尝试转换为二进制还是以 10 为底的数字来帮助我解决这个问题?
【问题讨论】:
标签: binary hex base subtraction
我正在练习十六进制减法,我似乎陷入了这个问题:
0B - 74
有人能解释一下如何执行这个计算吗?十六进制答案是 -69 但我似乎不明白为什么。我应该尝试转换为二进制还是以 10 为底的数字来帮助我解决这个问题?
【问题讨论】:
标签: binary hex base subtraction
0x0B - 0x74 = 0x0B + (-0x74),我们从小学就知道。
二进制补码告诉我们
-0x74 = (~0x74) + 1.
所以cpu是这样解决的:
1
00001011
+ 10001011
============
完成填写,就像小学一样,但更容易,因为它是 base 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。
没有魔法。初等数学。
【讨论】:
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 进制”可能有点困难。
【讨论】: