问: 补码为啥这么设计?
计算机内实际上没有减法操作,只能根据加法操作实现减法。根据两个互为相反数的数相加为0的性质,当某个数加上它的反码,能够将所有位数置为1,此时再加上1,即可向前进位,舍掉进位的位数,剩余位数全部为0,因此得到了值为0的数。显然取反再加1这个数即为该数的相反数,称为补码。这就是补码的设计思想(我所理解的)。
举个例子: 设某个数的原码为1010101,
其反码为0101010,相加得到1111111,
此时再加上1,即可向前进位,
假如前一位的位数是0,进位后得到 10000000,
舍弃其进位的位数,得到0000000,即为0
由此可见,某个数通过取反再加1可以得到某个数的相反数,即为补码。
机械计算机指的是电子计算机诞生之前的计算机械吧。
然后就是,您说的补码是自然现象,我不太理解。
假设二进制数最大取到第三位,那么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进制的运算,就先假设有一块从0到6的时钟,假设需要从0时走到1时,有两条路:“顺时针走1,”和“逆时针走6”,显然两者在7进制的规则下是“互补的”,只是假设人为的规定顺时针为正,那么逆时针就为负,那么想加运算就进行顺时针运算,减运算就是逆时针运算,但两者可以“相互转换”达到同一效果。在不同进制规则下,“补码”就好像是一个正数在参与计算时体现出了负数的性质。
我以前看到一种说法,不知道正不正确:
比如一个数减一个数,可以写成加这 个数的负数。
所以:1+(-1)=0,然后 (-1)=0-1;
根据电路的特点,超出位数不会记录, 0=0b1111+0b0001 成立;
(-1)=(0b1111+0b0001)-0b0001=0b1111;