先说补码表示的好处:1、减少计算机硬件设计开销(一个加法器可以完成加法,减法两种运算) 2、解决0的重复编码问题 3、多存储一个负值(-2的n-1次方,n为机器字长)
首先我们需要知道一个概念,计算机是用二进制表示数据的,数据的二进制形式即所谓机器数。为了表示负数,现代机器字长最高位用来表示符号位,最高位为0说明是正数,为1说明是负数。因此机器数的形式值不等于真值。1000 0101 的真值是-5,而不是形式值133。
正数的原码、反码、补码都是相同的,负数的反码是将非符号位取反,补码是在反码的基础上加1.
为什么?
以8位机器字长为例,假设机器只有加法器,我现在要进行加法减法运算
如果使用原码表示,8位一起参与加减法运算
3+5 = 8
0000 0011 + 0000 0101 = 0000 1000(似乎没有什么问题)
3-5 =-2 —>3 + (-5) = -2
0000 0011 + 1000 0101 = 1000 1000
因此,原码表示法无法进行减法运算!
如果用反码表示
由于正数的原码反码相同,所以不会产生问题
1 - 2 = 1+(-2) = -1
0000 0001 + 1111 1101 = 1111 1110(反码) = 1000 0001(原)
减法问题解决了
1 - 1 = 1+ (-1) = 0
0000 0001 +1111 1110 = 1111 1111(反码) =1000 0000(原)
似乎0有了符号!
于是补码诞生了!
0000 0001 +1111 1111 = 0000 0000 (进位的0舍弃了)于是0的编码[0000 0000]
为什么8位机器能表示-128-127的范围?
-128 补码 1000 0000 ,-128在8位机器在最高位为符号位的情况下是没有原码、反码的。
为什么反码表示法能解决减法问题? 为什么反码会出现+0和-0?
同样以8位机器字长为例,假设机器只有加法器
1-1=0 —>1+(-1)=0
0000 0001 + 1000 0001 = 1000 0010 (-2) 原码出现错误的原因,将符号位也一起运算了。
如果用反码表示:0000 0001 + 1111 1110 = 1111 1111(反) = 1000 0000(原码) 这样 0似乎有了两种编码