虽然原码能一一映射的表示-127~127这255个数但是在计算的时候硬件实现起来比较复杂,而且会出现两个0的表示,所以不是合理。
补码的出现他可以实现一一映射的表示-128~127这256个数,在计算时将减法变为加法进而实现了符号位也可以进行计算。补码是将负数看成一种后移,比如4-1那么就是说将4后移一个数得到的值就是计算的结果,那么我可以从4走到255在回到3就可以实现同样的结果(以8位表示数值为例),相当于加上255(总共256个数),相当于循环了一圈差一个,此时有进位我们不管即可,此时俩个8位加起来得到的值00000100+11111111=00000011(有进位),其中00000011是我们要的最终结果而进位是不要的。所以就实现了将减法变为加法进而符号位参与了计算,其实加负数相当于沿数轴的正方向走到255后再从0开始沿数轴正方向走完剩余的步数。用8位二进制来表示-128~127,就是用0~255来表示-128~127,形成一一映射关系,用补码表示时的映射关系如下图:
那么相加时什么时候会溢出呢,那么溢出只能出现在正正相加和负负相加,由于-128~127正数与负数幅值范围相当,正负相加最大(即正方向)为127(正数最大值)+(-1)(负数最大值)=最大值,而最小(即负方向)为-128(负数最小值)+(0)(正数最小值)=最小值,那么此时相加得到的最终值就是计算结果(不管是否有进位),即xxxxxxxx+yyyyyyyy=aaaaaaaa,那么aaaaaaaa即为计算结果,不管是否有进位。当正正相加的情况下,那么只能出现正方向溢出即超出127即大于等于128(10000000),那么就是0xxxxxxx+0yyyyyyy=aaaaaaaa,当aaaaaaaa的第一位为1时那么就说明溢出了,即第六位进位而第七位不进位;当负负相加时,即1xxxxxxx+1yyyyyyy=aaaaaaaa,不管最高位有没有进位,aaaaaaaa的值不能小于等于127,即1xxxxxxx沿数轴正方向走到255后从0开始再走时必须走到128以后,不能再128之前,不然就是溢出了,所以当aaaaaaaa小于01111111(127)时就认定为出现溢出,即结合1xxxxxxx和1yyyyyyy最高位均为1,相加肯定会进位,进位后如第六位有进位则最高位为1,也就是说第六位没有进位而第七位有进位时则出现负方向溢出。