计算机为什么采用补码来进行运算

1.基础知识了解

在计算机内,整数的长度是确定的,在字长为32位的计算机中,整数的长度就是32个二进制,这其中还包括了符号位(1表示正,0表示负)。这里面我们为了方便描述,就假设机器字长为8位。

例如,十进制整数23,二进制真值表示为10111,其原码表示为 0001 0111。

十进制整数-23,二进制真值表示为-10111,原码表示为 1001 0111。

简而言之,原码就是最高位为符号位,其他位表示该数的绝对值

如果计算机内部采用原码表示数,那么在进行加法和减法运算的时候,最终都转化为两个绝对值的加运算和减运算,因此,在设计计算器的时候就既需要设计加法运算器,又要设计减法运算器(代价有点大,是否可以就用一种类型的运算器呢? 其实大多数人都喜欢做加法运算,不太喜欢用减法运算)。

2.补码的思想

我们希望只设计加法运算器,不用减法运算器,我们希望找到一种方案,采用这种方案做加运算 1 + ( -1 ) ,两个数可以直接根据二进制的加法规则做运算,得到0,而不必做减法。

用 0000 0000表示0是很自然的想法,用 0000 0001到 0111 1111表示1到127的正数,也是自然的想法,此时,最高位的0可以做符号标识,也可以看成普通的二进制位。
现在问题是:怎么表示-1呢?
我们做一次逆向思维,0000 0001加上什么样的二进制数可以得到0000 0000?即:从右向左思考,加数的最右边的最低位必须是1,根据二进制加法规则:1+1=0,进位为1。再考虑次低位,加数的次低位也必须是1,然后加上1得0进一位,...依次类推,加数的8为都必须是1,才可以得到8个0。问题是最后产生一个进位,即:0000 0001 + (1111 1111)= 1 0000 0000
这在数学上是不可接受的,但是在计算机中去刚好合适,因为在设计中,每个数的长度是确定的,所以无论结果最后是多少,都只保留8位,多余的位会被丢弃。因此,我们可以将 1111 1111来表示-1,下面就是采用一种方式来合理的将-1怎么变成 1111 1111这种形式。

3.补码的定义

带符号整数有原码、反码、补码等几种编码方式。原码即直接将真值转换為其相应的二进制形式,而反码和补码是对原码进行某种转换编码方式。正整数的原码、反码和补码都一样,负数的反码是对原码的除符号位外的其他位进行取反后的结果(取反即如果该位為0则变為1而该位為1则变為0操作)而补码是先求原码的反码,然后在反码的末尾位加1后得到结果,即补码是反码+1
补码就是最方便的方式。它的便利体现在,所有的加法运算可以使用同一种电路完成。
以-8作为例子。假定有两种表示方法。一种是直觉表示法,即10001000;另一种是2的补码表示法,即11111000。请问哪一种表示法在加法运算中更方便?
随便写一个计算式,16 + (-8) = ?
  16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:
    00010000
   +10001000
   ---------
    10011000
  可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。
现在,再来看2的补码表示法。
    00010000
   +11111000
   ---------
   100001000
  可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,2的补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。

4.补码的本质

要将正数转成对应的负数,其实只要用0减去这个数就可以了。比如,-8其实就是0-8。
已知8的二进制是00001000,-8就可以用下面的式子求出:
  00000000
- 00001000
---------

因为00000000(被减数)小于0000100(减数),所以不够减。请回忆一下小学算术,如果被减数的某一位小于减数,我们怎么办?很简单,问上一位借1就可以了。
所以,0000000也问上一位借了1,也就是说,被减数其实是100000000,算式也就改写成: 100000000
   -00001000
   ---------
    11111000
进一步观察,可以发现100000000 = 11111111 + 1,所以上面的式子可以拆成两个:
   11111111
  -00001000
  ---------
   11110111
  +00000001
  ---------
   11111000
补码的两个转换步骤就是这么来的。(其中的 1111 1000 就是-8的补码,是由对 000 1000 取反得到111 0111 加1 最终得到 111 1000,最后加上符号位1就是1111 1000)。这就是补码计算规则的由来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容