一、问题的由来
对一个负数补码“取反加一”,等于求出其绝对值,然后再对这个绝对值“减一取反”即可算出原来的负数补码(这就是个逆向的过程,无可非议)。那么如果对这个绝对值采用“取反加一”的操作是不是也可以恢复成原来的负数补码呢?答案是肯定的,具体原因如下:
首先理解“补码的补码就是原码”这句话,其中第一个“补码”,就是名词补码,而第二个“补码”,是个代称,含义就是取反加一,这句话完整的意思是一个数的补码,取反加一后就还原成原码了。
一般来说,补码就是原码取反加一,还原成原码的时候应该先减去一再取反。其实在二进制里,“减一取反”和“取反加一”等价,所以我们可以这么做。
二、举例说明
为什么等价呢?
假设一个N位的二进制数,可表示的最大值是2N-1,例如八位二进制数,最大值是"11111111",就是28-1。
另设一个数n和“补数”x,在这个N位的二进制数里,x = 2N-1-n,即n + x = 2N-1。
那么对n取反,其实就是算出它对于当前N位数的最大二进制数的补数(因为一个数和自身取反相加必然是1),例如n是10110100(忽略符号位),取反后为01001011,此为x,而n+x=11111111,即当前N位数的最大二进制数,所以取反就是算补数。
那么对于数n,先取反求出补数2N-1-n,再加一得: (2N-n)
然后再先对n减一,得(n-1),再求补数:(2N-1-(n-1))= (2N-n)
因此,二进制里,"减一取反"和"取反加一"等价,补码减一取反或者取反加一的值都一样,都能求出原码。所以在实际应用中对一个负数补码通过“取反加一”的操作算出绝对值之后,再次通过“取反加一”的操作也是可以算出原来的负数补码的,其效果和“减一取反”是一样的。