十进制转二进制补码、原码,抑或是反过来二进制补码、原码转十进制,都拥有一套转化的规则,且较为简便。但是,计算机为什么要有补码出现?原码、反码不行吗?疑惑........
站在人的角度(十进制),以1+2=3为例,在计算机中如果这些常量以原码或反码存储在计算机中,假定占用一个字节。则:
若采用原码:1在存储单元中为“0000 0001”,2在存储单元中为“0000 0010”,那么,按位相加可得到“0000 0011”,该二进制串依旧为原码,转化为十进制则为3,正确,没有问题!
若采用反码:1在存储单元中为“0000 0001”,2在存储单元中为“0000 0010”,那么,按位相加可得到“0000 0011”,该二进制串依旧为反码,转化为十进制则为3,正确,没有问题!
这似乎看起来,对计算机来讲,计算机只要在对两个二进制串按位加减且进位就可实现数的加减等运算,然而并不能
以-1+2=1为例,假定占用一个字节,则:
若采用原码,很显然无法表示负数-1
若采用反码:-1在存储单元中为“1000 0001”,2在存储单元中为“0000 0010”,那么,按位相加可得到“1000 0011”,该二进制串依旧为反码,转化为十进制则为-3,与期望的结果不同
从以上可以看出,对十进制进行原码或反码编码都不能使计算机在加减等运算时使用同一套规则,即“按位加,能进位就进位”,运算是计算机的核心吧,倘若最基础的运算都不能具有规范式的准则,那应该对计算机来讲很难接受吧。
不讨论人们是如何发现采用补码可以满足“计算机使用同一套规则处理加减运算”,反过来,补码真的能让计算机处理加减运算时就只需一条准则吗?
依旧以-1+2=1为例,采用补码,且假定占用一个字节,则:
-1在存储单元中为“1111 1111”,2在存储单元中为“0000 0010”,“按位加,能进位就进位”,得到“0000 0001”,该二进制串依旧为补码,转化为十进制则为1.与期望值相同。
再以-1+-2=-3为例,采用补码,且假定占用一个字节,则:
-1在存储单元中为“1111 1111”,-2在存储单元中为“1111 1110”,“按位加,能进位就进位”,得到“1111 1101”,该二进制串依旧为补码,转化为十进制则为-3.与期望值相同。
总结,虽然上面不能真正证明补码能让计算机处理加减运算时就只需一条准则,但不难发现,它大概就是这样吧。计算机在处理其他运算时都是基于二进制加法的,补码能让二进制加法只需满足一条准则,所以,才有补码这种编码形式的出现与应用吧。