假设你有一个余额为143美元的支票账户。你开了一张78美元的支票,也就意味着要将一个值为负的78美元加到143美元上。-78对10的补数为999-078+1,即922。因此新余额为143美元+922美元,相当于65美元(忽略溢出)。如果我们又开了一张150美元的支票,需要在余额上加上-150,-150对10求补数为850。因此先前的余额加上850等于915,就是新的账户余额。而这个余额实际上是-85美元。
这样的机制在二进制中被称为2的补数。以8位二进制数为例。范围为00000000\~11111111,对应十进制中的0\~255。但是如果你还想表示负数的话,则以1开头的每个8位数都表示一个负数,如下表所示。
现在所表示的数的范围是-128\~+127。最高有效位(最左位)作为符号位(signbit)。符号位中,1表示负数,0表示正数。
为了计算2的补数,则首先要计算1的补数,然后再加1。这等价于将每位取反再加1。例如,十进制数125写为二进制为01111101。为了表示-125的对2的补数,首先将01111101的每位取反,得到10000010,再加1,得到10000011。可以根据前面的表格核实一下结果。用同样的步骤,每位取反再加1,可以将数值还原。
编码—隐匿在计算机软硬件背后的语言
158