原码 补码 反码
现在终于有了比较深的感受了。
首先进制是一个被承认的事情,也就是说溢出是一个公开合法的事情。
从冯诺依曼计算机的执行来考虑,我们可以进行正数原码的加法,减法正常考虑是让位减法,再加上-号,自然语言里可以出现‘-+’,但是这对于计算机是不可理解的事情,计算机和人类公共的语言是01,那么用符号位的思想可以用符号提示计算机(也可以看做是用加法实现减法)进行减法,符号位最大意义在于区别了正和负。
那么原码就出来了,正数的原码是其自然转出的二进制,负数的原码呢?那就是承认的位数下最高位设为1.
可是减法还是不能进行,问题在哪呢?在于这可以提示人类这是负数但并没有将负数运算完整的纳入运算体系,那能不能提前做好预备呢?可以的,将符号位不变其余都取反,相当于提前做好工作了。
试一下 +17 =00010001 ,-16=11101111,+17-16=1|0000 0000,诶等于0啊(所以在反码运算中如果最高位进位,结果在最低位加1),为什么呢,因为这个反码并不是真正的反向建立,0就有两个对应分别是 0000 0000 (+0) 1111 1111(-0)为了解决这个问题提出了补码。(因为1111 1111 +1=0000 0000)
正数的补码是其本身,负数的补码是其反码加1也就是原码除最高位取反再加1.
再尝试一下 +17=0001 0001 -16=1111 0000 +17-16=0000 0001 好了,这样结果就对了