我将直接回答标题所要求的内容(抱歉,细节对每个人来说并不像理解翻转位+加一个来自何处那样普遍)。
首先让我们回顾一下我们可以用它们进行标准(小学)算术(即添加数字和进行结转等)的事实来激发二进制补码。易于计算是这种表示的动机(我假设这意味着我们只有 1 个硬件来做加法而不是 2 如果我们以不同的方式实现减法而不是加法,并且我们在小学加法中以不同的方式做和减法)。
现在回想一下二进制补码中每个数字的含义以及这种形式的一些二进制数作为示例(幻灯片来自麻省理工学院的 6.004 课程):
现在请注意,算术在这里正常工作,符号包含在二进制补码本身的二进制数中。特别注意:
1111....1111 + 0000....1 = 000....000
IE
-1 + 1 = 0
利用这个事实,让我们尝试推导出两个补码表示-A
应该是什么。所以要解决的问题是:
问:给定二进制补码表示,二进制补码表示A
什么-A
?
为此,让我们使用我们知道的值做一些代数:
A + (-A) = 0 = 1 + (-1) = 11...1 + 00000...1 = 000...0
现在让我们-A
用二进制补码表示的数字表示主题:
-A = 1 + (-1 - A) = 000.....1 + (111....1 - A)
where A
is in two's补码。所以我们需要计算的是二进制补码格式中-1和A的减法。为此,我们注意到数字如何表示为其基数的线性组合(即2^i
):
1*-2^N-1 + 1 * 2^N-1 + ... 1 = -1
a_N * -2^N-1 + a_N-1 * 2^N-1 + ... + a_0 = A
--------------------------------------------- (subtract them)
a_N-1 * -2^N-1 + a_N-1 -1 * 2^N-1 + ... + a_0 -1 = A
这实质上意味着我们减去每个数字的对应值。这最终只是简单地翻转位,导致以下结果:
-A = 1 + (-1 - A) = 1 + ~ A
~
位翻转在哪里。这就是为什么您需要位翻转并加 1。
评论:
我认为对我有帮助的评论是补码类似于逆,但不是给0
它2^N
(根据定义),例如,A
我们想要的数字是A+~A=2^N
3位。至少这澄清了“补语”这个词在这里的含义,因为它不仅仅是和的含义的反转。010 + 110 = 1000 = 8
2^3
0
1
如果您忘记了二进制补码是什么,这可能会有所帮助:什么是“2 的补码”?
我希望在某个时候阅读康奈尔的答案:https ://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html#whyworks