为什么计算机要用反码和补码

学了这么久计算机突然还是对这个东西不理解,今天查看了许多帖子才明白,总结了一下

首先,明白计算机是只会做加法的,再面对减法,除法,乘法等运算时,都会转化为加法。譬如,2-2,也就是2+(-2),至于为什么计算机只会加法,这恐怕牵涉到电路设计等一系列知识,此事绝非我等应该讨论的事情

原码,就是一个数的二进制表示,在计算机中所有数据都以二进制表示,规定消耗一个位(最高位)用来储存这个数的正负。1代表这个数是负数,0代表这个数是正数,那么在用一个字节表示时,2的原码是0000 0010,-2的原码是1000 0010。我们试着用-2的原码加上2的原码,结果是1000 0100,得到的结果是-4(因为首位为1,是负的),然而-2+2=0才对,那么原码表示法在遇到负数运算的时候行不通了。

注意:用原码进行运算时,得到的结果就是原码,用反码进行运算时,得到的结果也是反码,要知道结果是多少,就要把这个反码转成原码,同理,用补码进行运算时,得到的结果是补码。

反码,一个正数的反码等于它的原码本身,而一个负数的原码,保留起符号位不变,其他按位取反(也就原来是1就变0,原来是0就变1),那么可得-2的反码就是1111 1101,而2的反码还是0000 0010,我们再试着将他们相加,结果是1111 1111,我们得到的这个首位为1,这肯定是个负数的反码,我们按位取反得到这个数的原码就是1000 0000,结果是负0,反码表示就必定会出现负零,1000 0000,和正零,0000 0000两种0的表示情况,尽管这看起来很奇怪,但是这还是在计算机中实现了负数的运算。

模运算,可以理解为对模取余,就像钟表一样,如果现在是3点,我们想把钟调到6点,我们课顺时针旋转时针3格,还可以逆时针旋转时针9格,在钟表里,模是12,我们认为3+3=6,而3-9=-6,再加上模的整数倍,也是6。3和9为补数,3+9刚好等于模,也就是说,当我们加上一个数时,就相当于加上这个数的补数,补数等于模加真值,3+(-9)=3+3=6,因为在模运算中-6加上模就等于6。

补码,一个正数的补码等于其原码本身,一个负数的补码等于其反码再加1,另外,还有一种求补码的方法:模真值,真值代表这个数本身。在用一个字节表示时,模等于2^8即256。n为的二进制数,其模等于2^n。根据时钟的思想,我们知道,在计算机进行数值运算的时候,首先会把待运算的数转换成补码,前面的反码成功解决了负数的运算,但是有一个缺点就是会出现正负零,1000 0000,0000 0000,而一个数怎么会出现两种表示方法呢,这在计算机里是不允许的,另外也浪费了内存,两个储存空间代表的值是一样的。我们试着求一下1000 0000和0000 0000的补码,注意发生数值溢出时,则直接舍去进位,因为一个字节只有8位,是不是发现,它们的补码都是0000 0000。这用补码表示时就成功的解决了正负零的问题,而且这样就多出一个储存空间出来了,而原本存储-0的那个状态,1000 0000现在存储-128

在c语言中,char类型的范围是[-128,127],我们定义char类型的n=127,我们让n再加1,然后输出n,结果是-128。这是为什么呢?127的补码是0111 1111,而1的补码是0000 0001,相加得1000 0000,这正好是-128的补码,所以输出-128。

总结:

原码不能进行负数的运算,因此引出反码,而反码有正负零的现象,所以引出补码,补码完美解决了上述问题,同时我们要明白,-128是没有源码的,因为这是之所以能表达-128,是将原本表达-0的状态用来表达-128的,所以补码能表达的范围要多一个-128。

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值