先以10进制说明补数的定义:32的补数是100-32,320的补数是1000-320。所以,一个数的补数就是和这个数相加得到最小的比它高一位的数,这样二进制数的补数也就清楚了。10011的补数就是100000-10011=11100。
二进制数的补数的计算方法是:(1)如果原数最后一位为1,则从右往左看,这个1不变。其它位数将1变成0,将0变成1。(2)如果原数最后一位为0,依然是从右往左看,第一个1出现之前所有的0都不变,第一次出现的1也不变,从这个1之后往左所有的位将1变成0,将0变成1。
注意,二进制补数和计算机的二进制补码并不是同一件事。计算机中二进制数都是以补码的形式存储,由于数值有正负之分,因此第一位为符号位。设计补码的目的是:(1)使符号位能够参与运算;(2)将减法转化为加法运算。打个比方,如果带有符号位的正数和负数直接进行加法运算,得到的数值就一定是比这个负数数值还要小的负数,这显然是不合常理的。以一个例子说明:假设计算机处理的位数为8位。3+ (-15)= 00000011 + 10001111 =10010010,十进制为-18,就相当于3+15然后去负号。但如果转化为补码,3 + (-15)= 00000011 +11110001 =11110100,这个数恰好为-12(10001100)的补码。而这样运算相当于原码的的3+(-85)。刚才已经验证,3+(-85)=-(3+85)=-88,取补码后就是-12。
当然,补码和本文之前所说的补数也有共通之处,计算机存储的负数的补码就和这个数的补数是相等的(第一位不算,因为它使符号位)。当然,正数的补码和原数一致。