为什么计算机负数的补码取反后要加一?要加一?要加一?

如题所述

取反加一,并不是补码的定义。

补码的来源,并不是什么原码反码符号位以及取反加一。

补码,其实,是一个“代替负数运算的”的正数。

借助于补码,减法,就可以用加法代替。

利用补码,统一了加减法,目的是简化计算机的硬件。

--------------------------

为什么正数(补码)能够代替负数呢?

用十进制来说明,比较容易理解。

如果限定【仅用 2 位 10 进制数】,可以有:

  24 - 1 = 23

  24 + 99 = (一百) 23

保留 2 位数,就必须舍弃进位。

此时,+99 就和-1 是等效的。

+99,就称为-1 的补数。

+98,是-2 的补数。

。。。

如果,使用 3 位 10 进制数,-1 的补数,就是+999 了。

求补数的公式:

  补数 = 负数 + 10^n, n 是位数。

--------------------------

计算机使用 2 进制,补数,就改称为:补码。

8 位 2 进制的范围:0000 0000~1111 1111 (十进制 255)。

共有 2^8 = 256 组。

此时,-1 的补码,就是 255 (1111 1111)。

同理,-2 的补码是 254 (1111 1110)。

求补码的公式:

  补码 = 负数 + 2^n, n 是位数。

只有负数,才需要用补码替换。

正数,不存在变换成补码的问题。

在 256 组二进制中,用 128 组来代替负数:-1~-128。

-128 的补码是:-128 + 2^8 = 128 = 1000 0000。 

以上,就是【补码的来源,以及意义】。

--------------------------

为什么是“取反加一”?

下面用 4 位二进制数来说明。

假设一个负的二进制数是:X =-xxxx。

负号(-)说明 X 是负数。后面的 xxxx,是绝对值。

那么,[X]补 = -xxxx + 2^4

       = -xxxx + 1 0000。

式中的 1 0000,可以写成: 1 + 1111。

那么,[X]补 = 1111-xxxx + 1。

式中的 1111-xxxx:

  如果 x 是 0,1-x 就是 1。

  如果 x 是 1,1-x 就是 0。

  所以,这就是【对绝对值 xxxx 取反】。

式中的 + 1:

  就是在取反之后,再加上 1。

经过“取反、加一”就得到 X 的补码了。

注意:

 取反时,只是对 X 的绝对值 xxxx 取反。

 此时,既没有说到“原码”,也没有说“反码”。更没有说“符号位不变”。

 所以,虽然可以用“取反加一”求出补码,但是,这个补码,与“原码、反码和符号位”都没有任何关系。

特别是-128,它并没有原码和反码,怎么求补码呢?

那么,原码反码符号位,有嘛用? 又是哪来的呢?

真是怪事。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-16
按位求反后得到的是反码
反码在计算上和原码一样不方便,而且还有异常表示的情况:
0: 0000 0000
-0: 1111 1111
反码+1后得到补码,补码具有良好的运算性质,而且没有异常表示情况。本回答被提问者和网友采纳
第2个回答  2017-08-31
http://shake863.iteye.com/blog/1484683 这个博客很清楚的解释了为什么负数补码要加一
相似回答