正整数的补码就是原码本身,所以本文主要梳理求负整数的补码的三种方法。为了进行数学化的表示,在正文开始之前我们规定:-N表示负整数,N表示-N的绝对值,N*表示-N的补码,该数的二进制位数为n,且N、N*和2^n都当作无符号正数。
方法一:N*=2^n-N
负整数-N的补码本质上就是其绝对值N的补数N*,故用数学表达式表示即为:补码N*=2^n-N。以-N=-7,n=4为例:
(1)N*=2^4-N=16-7=9。因为N*是作为无符号正数,所以N*=9用二进制表示即为:(1001)₂,此即为负整数-N的补码。
(2)N*=(10000)₂-N=(10000)₂-(0111)₂=(1001)₂,此即为负整数-N的补码表示。
方法二:N各位取反再加1
将方法一的公式改写为:N*=(2^n-1)-N+1。改写的原因在于:假如说用4位表示一个整数,2^n就是16,这个数如果直接用二进制表示的话就需要5位,而2^n-1恰好是可以用4个二进制位来表示的最大无符号正整数。以-N=-7,n=4为例:
N*=15-N+1=(1111)₂-(0111)₂+(0001)₂=(1000)₂+(0001)₂=(1001)₂,此即为负整数-N的补码表示。
观察此计算过程,发现求-N的补码(N*)其实就是把N即(0111)₂的各位求反得到(1000)₂,然后加1从而得到(1001)₂。而这种求补码的方式也是上学时很多老师都会讲的,只是没有将该方法数学化。
方法三:从N的最右边开始,遇到的第一个1和其右边的所有0保持不变,其它各位取反
个人认为该方法就是方法二的规律的进一步总结。N各位取反再加1也就是从N的最右边开始,遇到的第一个1和其右边的所有0保持不变,其它各位取反。根据该方法,可以直接写出负整数-N的补码为(1001)₂