上述:从计算机的原码、反码、补码可以看出,计算机有3种编码方式,表示相同的个数。
原符号:符号位加上真值的绝对值,第一位表示符号,剩下的位表示值。 反符号:正的反符号是其本身; 负数的反码基于其原始码,编码比特不变化,剩余比特取反。 补数)是正补数还是其本身; 负数的补数基于其原始代码,符号位保持不变,其余的位相反,成为最后一个。 也就是说,反转加1。 关于1和-1,
原=0001反=0001补
-1=1001原=[1110]反=[1111]补
为什么计算机要用补数的形式表示负数呢?
首先,我们知道,某个数在计算机中有正负之分,该数的最高位比特(符号比特)用来表示其正负。 其中,0表示正,1表示负。
对计算机来说,加法是最基础的运算,需要尽量简单地设计。
根据加法的算法,a-b等于a(-b )。
如果符号位也能参与运算,而不是单个“符号位的识别”,则可以大大简化计算机的基础电路。
因此,开始探索只保留加法,使编码比特参加运算的方法。
1、原码:1 - 1 = 0
我们先来看看源代码。 1 - 1=01-1=1(-1 ) )。
=原[ 0001 ]原
=原
=-2
这显然是错误的。
2、反码:1 - 1 = 0
解码时:1-1=1(-1 ) )。
反[1110]反
=[1111]相反
=[1000]原
=-0
用反码计算后,发现结果是正确的。 但是,一个问题是“0”的表示有两个:
-0(1000 ) )0) (0000 ) )中给0加符号是没有意义的。
另外,采用补数形式,对于4位的二进制,其表现范围为[1000]逆~[0111]逆,即[1111]原~[0111]原,即[-7,7 ]。
“0”有两种编码格式,这意味着浪费了一种编码。
在
3、补码:1 - 1 = 0
添加代码可以解决反码问题。1-1=1(-1 )。
=[0001]补[1111]补
=[0000]候补
=元
=0
补数不仅可以解决0的代码和2个编码的问题,还可以用[1000]表示-8,即最少数多一个。
也就是说,对于4位的二进制,由原码或反码表示的范围为[-7,7 ],由补数表示的范围为[-8,7 ]。
由于计算机用补数表示负数,所以关于编程中常用的32位int型,可以用[-2 ^ 31,2 ^ 31-1 ]的范围表示。