进制计算
二进制
普通计算机中,所有数据都是二进制的
在数字电路中,加法比较好实现
因为只需要一个异或门和一个与门(异或门负责加当前位,与门负责进位)
就可以实现一位的加法
但是减法就比较困难,没法直接计算
由此,负数就以补码形式表示
正数的补码是它本身,负数是它的按位取反加一
然后计算一个数和另一个数的相反数的和
Why?
其实这是一个先发现二进制数的性质,再进行算法编写的过程
以一字节为例
0001 1001 = 25
0000 0100 = 4
取4的反码就是用255-4=251(255=1111 1111)
再加一就相当于256-4=252
相当于在一个256大小的空间中扣掉了4格
让256+25=277
然而计算过程中只有8位
所以第8位(128)满了之后要进的第九位(256)被直接丢 掉了
最终在一字节内的结果是277-256=21
相当于用25格其中的4格填到251格凑成一个256
然后像俄罗斯方块一样,达到256的块就被消除了
最后剩下21,就是25-4的结果
所以,当发现这个性质之后
有符号数的存储和计算就会在存储空间中对半砍
一半表示正数,一半表示负数
一般存储空间中最高位表示符号位,0为正(或0),1为负
(最高位此时代表的值为它的相反数,其他位代表值不变,意思指在取反后只看非最高位,相当于用(128-非最高位数)-128)
负数就用反码加一表示了(表示这个数的距离最大空间还缺了x个)
延伸来看,就不难理解为什么会出现255+1=0或者128+1=-127的情况了(最高进位损失了)