需要解释两个补码的想法

时间:2014-10-30 19:04:52

标签: twos-complement

您能否解释以下问题的解决方案? 我不明白我们如何得出这个结论-2 ^(n-1)+ 2 ^(n-1)-1 -x 特别是我很困惑为什么我们需要减去x

您可以通过获取二进制补码方法中的负数表示 一个数字的补码然后加一个。它为什么有效?两个补码表示背后的关键思想是什么? 答案:关键的想法是将符号位视为带负号的值。在n位表示中, 符号位的值为-2 ^ n1。 当你有一个正数x。通过两个补码你想得到-x。 在正数x中,符号位为0.当你取一个数字的补码时,你得到:

-2 ^(n-1)+ 2 ^(n-1)-1 -x

简化后,你得到-x-1。当你为数字添加+1时(如同两个补码:取一个补码并加一个),你得到-x。 这为零提供了唯一的表示。此外,所有的数字计算都是根据2的幂来计算的,与负数的表示不同。

2 个答案:

答案 0 :(得分:1)

您提供的解决方案似乎解释了One和Two的恭维不必要地复杂化。简而言之,通过翻转数字的二进制表示中的所有位来获得恭维。让我们说n = 8,x = 13,然后在恭维中

x = 00001101(无符号值13)

-x = 11110010(无符号值242 = 255 - 13)

即。 -x表示为2 ^ n - 1 - x

恭维只是恭维加上1:

-x = 11110011(无符号值243 = 255 - 13 + 1)

即。 -x表示为2 ^ n - x

返回您提供的解决方案:

-2 ^(n-1)= 10000000

2 ^(n-1)-1 = 01111111

-2 ^(n-1)+ 2 ^(n-1)-1 = 11111111

( - 2 ^(n-1)+ 2 ^(n-1)-1) - x翻转x的二进制表示中的所有位,正是One的恭维所做的。 IMO,这种解释非常违反直觉,上面的解释(或来自维基百科)要好得多......

答案 1 :(得分:0)

我不确定我完全理解你的问题。二进制补码是用于使某些事情变得更容易的格式,它仅在您以某种方式限制值(固定位数)时才有效。对于4位字,零的补码为1111,为了得到2的补码,你加1,它将所有位翻转到0000,这很方便。 0001的一个补码是1110,加一个得到1111,当解释为有符号值时为-1。

     1's     2's
2   1101   1110
3   1100   1101
4   1011   1100

第一个(MSB)位始终指示值是正还是负。其他值为“正数”(1,2,3,4 ...)为正值,“倒计数”(-1,-2,-3 ...)为负值。

很难用非离散的代数术语来表达这一点,因为我们通常认为它们的“数字”是无限的。