国内很多教材对于计算机表示负数大都只有一句话,“取反加一”,并称之为“补码”。教材编写水平之低令人发指。实际上“二进制补码”只是人为定义的一个概念,与“黄赤交角”一样。不是在说明问题的本质,而是在解释解决问题的办法。
计算机表示负数,运用的是“溢出原理”。举例说明,如8位计算机寄存器。 0000 0000(2)= 0(10)同时 1 0000 0000(2)= 0(10)所以1111 1111 + 0000 0001 = 0000 0000,下面说明 -8 在计算机中的表示,表示方法为 -8 = 0-8 = 1111 1111 - 0000 1000 + 0000 0001 = 1111 1000,所以 1111 1000 就是-8 在计算机中的表示。于是乎,人们就总结了2条规律:1. 负数在计算机中的表示为 取反+1,取反+1成为这个数的二进制补码。2.最高位为符号位,1负,0正。
又引出一个重要的问题,是关于0的。0在数学中不存在正负,但如何解释可能出现在寄存器中的这两个数?1000 0000 = -0 ?? 0000 0000 = +0 ?? 计算得知,8位寄存器取值范围是 -127至 -0 +0至+127,于是认为规定,1000 0000 = -128,0000 0000 = 0.这样规定使得在8位寄存器中,-128 没有与之对应的正数,但权衡利弊,这已经是最佳解决方案。至今所有计算机,指令集也遵循这套方案。