计算机为什么要搞出“补码”这种东西?

计算机为什么要搞出“补码”这种东西?

本文阐述两个问题

①计算机为什么要搞出个“补码”?不嫌麻烦?

②为什么-128的补码是10000000?


计算机为什么要搞出个“补码”?

先回顾一下补码是什么:
|--正数的补码是其本身(二进制原码)
|--负数的补码是在原码的基础上,符号位不变,其余位取反后加1。
为什么好好的“原码”不用,非搞个“补码”出来?顺带还迁出个“反码”……

究其原因,主要是因为计算机只会做加法,使用补码可以把减法转为加法计算。
关于计算机不会做加法,我们要表示理解,毕竟是那种国家发明的……

其实你也未必会做减法呀……

好了,言归正传,回到计算机的世界。
举个简单的例子:1-1=0
|--如果让计算机计算这个简单的算术,它只能转成加法:(1)+(-1),
|--如果按二进制直接算(即按原码算,左一是符号位)

  • 二进制( 1): 0000 0001

  • 二进制(-1): 1000 0001

  • 按位加等于:1000 0010

换为十进制是(-2),谬矣!

如果用补码算:

(1)是正数,的补码还是0000 0001

(-1)先求反码,符号位不变,其余位取反:1000 0001→1111 1110

末位加1,得1111 1111

于是有以下两数相加:

  • 0000 0001
  • 1111 1111

得到:[1]0000 0000

左侧进位的1舍弃,该数就是0,计算正确。

所以,补码的作用就是:把减法转成加法进行计算


为什么-128的补码是10000000?

二进制1000 0000表示的有符号数是-128,这个也很奇怪:

荒谬①:-128按规则求补码应该是[1] 1000 0000,已经溢出,未溢出的左一为符号位,其他位数取反得1111 1111,末位加1,得0000 0000,这是0的原码!

荒谬②:按补码的性质,1000 0000符号位为1,是负数;逆推原码先推反码,需末位-1,成了0000 0001,符号位为0,成正数了,自相矛盾,不用继续。

所以1000 0000无法按照补码规则推断源码,

它是-128的补码是一个“规定”。

从另外一个角度讲,补码的存在,实现了有符号数和无符号数的一种对应关系,下图的也形象的说明了把1000 0000定为-128的补码合情合理。

posted @ 2019-04-05 11:44  虎老狮  阅读(1078)  评论(0编辑  收藏  举报