·

问: 补码为啥这么设计?

Replies
7

计算机内实际上没有减法操作,只能根据加法操作实现减法。根据两个互为相反数的数相加为0的性质,当某个数加上它的反码,能够将所有位数置为1,此时再加上1,即可向前进位,舍掉进位的位数,剩余位数全部为0,因此得到了值为0的数。显然取反再加1这个数即为该数的相反数,称为补码。这就是补码的设计思想(我所理解的)。

举个例子: 设某个数的原码为1010101,

              其反码为0101010,相加得到1111111,

              此时再加上1,即可向前进位,

              假如前一位的位数是0,进位后得到 10000000,

              舍弃其进位的位数,得到0000000,即为0

              由此可见,某个数通过取反再加1可以得到某个数的相反数,即为补码。

你知道机械计算机吗,有木有想过补码其实是自然现象

111 + 1 = (1)000

什么数加一等于 0 ? 所以 111 = -1, 那 -2 呢

机械计算机指的是电子计算机诞生之前的计算机械吧。

然后就是,您说的补码是自然现象,我不太理解。

假设二进制数最大取到第三位,那么2 = 010,取反后就是101,再加1就是110

所以2的补码是110,也是-2的原码。

另外,由于进位发生变化的是符号位。

下面是求2的补码(即-2的原码)代码

#include <iostream>
using namespace std;

int main()
{
    int n = 2;
    
    n = ~n + 1;
    cout << n << endl;
 
    for(int i=2; i>=0; i--)
    {
        if(n >> i & 1) cout << 1;
        else cout << 0;
    }
    puts("");

    return 0;
}

运行结果是

-2
110

别掉进运算规则里不出来了

规则是后来的人定义的,用木棍儿就不能算加法了吗

现在不理解也没关系,没准哪天就突然懂了,自然的哲学原理

可以先想想进制的本质是啥

让你做 7 进制的运算你要怎么计算

我认为宏观来看进制只是表示“值”的方式,不管是几进制,这个“值”都是客观存在的东西。计算机采用二进制是由现阶段物质条件因素而采取的“最优方式”。

仔细想一想,脱离“原码取反加一”之类的运算规则,补码更像是“反方向走的时针”。如果要做7进制的运算,就先假设有一块从0到6的时钟,假设需要从0时走到1时,有两条路:“顺时针走1,”和“逆时针走6”,显然两者在7进制的规则下是“互补的”,只是假设人为的规定顺时针为正,那么逆时针就为负,那么想加运算就进行顺时针运算,减运算就是逆时针运算,但两者可以“相互转换”达到同一效果。在不同进制规则下,“补码”就好像是一个正数在参与计算时体现出了负数的性质。

我以前看到一种说法,不知道正不正确:

比如一个数减一个数,可以写成加这个数的负数。

所以:1+(-1)=0,然后 (-1)=0-1;

根据电路的特点,超出位数不会记录, 0=0b1111+0b0001 成立;

(-1)=(0b1111+0b0001)-0b0001=0b1111;