计算机底层只有加法运算器,没有减法。

一、正码
以0开头的二进制码,比如127=01111111,其中0为符号位,后面7个数字为实际大小,那按照-127=11111111这个值,就会出现一个问题
假如1=00000001,-1=10000001
我们这个时候做运算,使用二进制逢二进一,就会出现1+(-1)=10000010,得出结果就是-2,因此出现了反码
二、反码
反码在正码的基础上,规定一个正二进制数的反码等于其正码;而负数的反码在正码的基础上符号位不变,但计数位取反。
即是1的正码为00000001,反码为00000001;
但是-1的正码为10000001,反码为11111110;
那这个时候我们用反码进行运算可以得到00000001+11111110=11111111这个反码结果,这个时候反码取正,得到10000000,即是0。
但此时也出现了一个问题,正常的0+0=00000000,那么就是出现了10000000和00000000两种0,这个时候就像你用着3060打黑神话,但马赛克筋斗云还是让你总觉得差点什么
三、补码
补码在反码的基础上加1,当然还是只针对负数的情况,其实到这里就可以感觉到,所谓反码、补码其实都是一系列的约定俗成,所谓正码只是为了我们看着简单,看了首位符号位,后面的数字加一加就可以了,然后反码的出现只是为了最后补码的过渡。因为到目前为止,计算机底层实际使用的就是补码来计算
1的正码为00000001,反码为00000001,补码为00000001
-1的正码为10000001,反码为11111110,补码为11111111
这个时候两个数相加,得到(1)00000000,抹掉高位溢出,就不会再出现+0和-0
那么-127用正码表示为11111111,反码为10000000,补码表示为10000001,这个时候敲重点,-127的正码跟-1的补码看着一模一样是吧,因为咱们学习二进制一开始就是学的正码,就导致你看到这个数字就会下意识算一算等于多少,但是就像计算机的二进制是人为规定的,再到这里的反码补码也是人为规定的,需要跳出来换思维来看
就像-127=10000001【反码】,这个时候加1等于10000010,当然减1等于10000000(这个数只有反码能表示出来-128)
反码的出现成功的表示出了-128,也导致你用反码+1,去运算看着好像很流畅,减的话比较奇怪,就像11111111=-1,如果加上1的话,高位去掉确实是0,但0-1呢?难道用我们学习的减法,向上借一位?所以只是人为规定吧

4485

被折叠的 条评论
为什么被折叠?



