我只是好奇,为了在二进制中表示-1,是否有一个原因,使用了2的补码:翻转位并加1?
-1由11111111(2的补码)表示,而不是(对我来说更直观)10000001,10000001是二进制1,第一位为负标志。
免责声明:我的工作不依赖二进制算术!
我只是好奇,为了在二进制中表示-1,是否有一个原因,使用了2的补码:翻转位并加1?
-1由11111111(2的补码)表示,而不是(对我来说更直观)10000001,10000001是二进制1,第一位为负标志。
免责声明:我的工作不依赖二进制算术!
当前回答
我有一个在某些情况下很重要的小补充:在这些限制条件下,2的恭维是唯一可能的表示:
无符号数和二的补数是恒等交换环。它们之间有一个同态。 它们共享相同的表示,对负数有不同的分支切割,(因此,为什么它们之间的加法和乘法是相同的)。 高位决定符号。
要知道为什么,它有助于降低基数;例如Z_4。
星座、星等和一个人的赞美都不能形成一个具有相同数量元素的环;一个症状是双零。因此,很难在边缘上工作;为了在数学上保持一致,它们需要检查溢出或陷阱表示。
其他回答
扩展一下其他的答案:
在two's complement中
加法与普通正整数加法的原理相同。 减法也不会变 乘法!
"组织"需要不同的机制。
所有这些都是正确的,因为2的补是普通的模算术,我们选择通过减去模来看待一些负数。
你的目的并不是把二进制数的所有位都颠倒过来。实际上就是用1减去每一位。这只是一个幸运的巧合,1减1得0,1减0得1。所以翻转位有效地执行了这个减法。
但为什么每个数字的差值都是1呢?你不是。您的实际目的是计算给定的二进制数与另一个具有相同位数但只包含1的二进制数的差值。例如,如果您的数字是10110001,当您翻转所有这些位时,您实际上是在计算(11111111 - 10110001)。
这解释了计算二的补的第一步。现在让我们在图中加入第二步——添加1。
将上述二进制方程加1:
11111111-10110001 + 1
你得到了什么?这样的:
100000000-10110001
这是最终方程。通过执行这两个步骤,你试图找到这个,最终的区别:二进制数减去另一个二进制数,多出一位,并且除最高位外都包含零。
但我们为什么要追求这种差异呢?好吧,从现在开始,我想你最好去读维基百科的文章。
使用2的补码是因为它更容易在电路中实现,也不允许负零。
如果有x位,2的补码范围从+(2^x/2+1)到-(2^x/2)。补码将从+(2^x/2)到-(2^x/2),但允许负数为零(0000在4位1的补码系统中等于1000)。
我有一个在某些情况下很重要的小补充:在这些限制条件下,2的恭维是唯一可能的表示:
无符号数和二的补数是恒等交换环。它们之间有一个同态。 它们共享相同的表示,对负数有不同的分支切割,(因此,为什么它们之间的加法和乘法是相同的)。 高位决定符号。
要知道为什么,它有助于降低基数;例如Z_4。
星座、星等和一个人的赞美都不能形成一个具有相同数量元素的环;一个症状是双零。因此,很难在边缘上工作;为了在数学上保持一致,它们需要检查溢出或陷阱表示。
尽管这个问题已经很老了,但还是让我说说我的看法。
在我解释这个之前,让我们回到基础上来。2'补码等于1'补码+ 1。 那么1的补是什么,它的加法意义是什么。
任何n位数和它的1的补数的和给出了可以用这n位表示的最大可能的数。 例子:
0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
1111 (the highest number that we can represent by 4 bits)
现在如果我们尝试在结果中再加1会发生什么。这将导致溢出。
结果将是1 000,即0(因为我们处理的是4位数字,(左边的1是溢出)
So ,
Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)
于是有人决定把1的补体+ 1称为2'补体。所以上面的表述变成: 任何n位数+它的2的补= 0 也就是说2对一个数的补= -(该数的补)
所有这一切又产生了一个问题,为什么我们只能使用n位中的(n-1)来表示正数,为什么最左边的第n位表示符号(最左边的0表示+ve个数字,1表示-ve个数字)。例如,为什么我们在Java中只使用int的前31位来表示正数,如果第32位是1,它是-ve数。
1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________
1 0000(结果为0,进位1溢出)
因此(n + 2'补n) = 0的方程组仍然成立。这里唯一的歧义是2对12的补码是0100,它也模糊地表示+8,而不是在2s补码系统中表示-12。
如果正数的最左边总是有一个0,这个问题就可以解决了。在这种情况下,它们的2的补位总是在最左边有一个1,我们就不会有相同的位集表示2的补位数和+ve数的模糊性。