想象你是一个科学家,你现在要解决整数在计算机内存储的问题。已知,计算机由于硬件,只能有0,1(高低电频)两不同的存储方式,所以你要怎么表示整数?
数字是用来计数的,所以你想到了二进制,每一位的有0,1不同的状态,n位你就可以表示2^n个不同的状态,每一个状态和一个正整数对应,如2和(0010)对应,你就解决了正整数的储存问题。
但是负数怎么办?有一些数字电路基础的人应该知道,对于adder(加法)用的是XOR(异或运算) 。为什么?我们可以列一个真值表 (0+0=0 0+1=0 1+0=1 1+1=0)这样的运算规则与我们的数学运算规则相符。
如果计算机的数学和人类认知相符,和物理硬件相符,那1-1=0 即 1+(-1)=0。所以-1的表示应该是一串和1相加结果为0的0 1数码。
如图ABCD表示-1的二进制补码,先看D,与真值表对应,我们得知D应该是1。这里要注意的是1+1=10,到C的时候要接受来自D的一个进位,因此C应该为1,这样1+1+0=(1)0,即C本身的数1加上进位的数1,加上要与其相加的数字1在C位的二进制数字0,结果才能是0。依次类推,-1的数码应该是(1111),这里以4位为例,最后进位得到的1直接忽略(看做是溢出,不进行储存)。这样我们就得到了-1的数码,(1111)和进行规则得到的二进制补码相同。
按照二进制补码规则得到-1的补码:(以下2种方法来自《计算机科学导论》第三版 32页 )
1.1的反码(1110)+1 => 1111
2.1的二进制(0001)从最右边一位复制,直到有1被复制,然后反转其余的位 -> 1111
总结:这种表示方法应该是按照人的计算需求,并且符合已有的物理水平而产生的,具体的二进制补码运算规则应该是研究得出。
说明:以上均为个人理解,如有错误请积极指出,感谢!