一文搞懂原码、反码、补码

如题所述

需要声明的是,本文涉及到的数字及运算均基于 8位bit 下的值。

最高位为符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制表示。

如:

127的原码为0111 1111
-127的原码为1111 1111

正数的反码与原码一致;

负数的反码是对原码按位取反,只是 最高位(符号位)不变

如:

127的反码为0111 1111
-127的反码为1000 0000

正数的补码与原码一致;

负数的补码是该数的 反码加1

如:

127的补码为0111 1111
-127的补码为1000 0001

总结一下就是:

下面就来探讨一下,为啥要用补码来表示数字。

如果计算机内部采用原码来表示数,那么在进行加法和减法运算的时候,需要转化为两个绝对值的加法和减法运算;

计算机既要实现加法器,又要实现减法器,代价有点大,那么可不可以只用一种类型的运算器来实现加和减的远算呢?

很容易想到的就是 化减为加 ,举一个生活中的例子来说明这个问题:

时钟一圈是360度,当然也存在365度,但其实它和5度是一样的;

相同的道理,-30度表示逆时针旋转30度,其与顺时针旋转330度是一样的;

这里数字360表示时钟的一圈,在计算机里类似的概念叫 ,它可以实现 化减为加 ,本质上是将 溢出的部分舍去 而不改变结果。

易得,单字节(8位)运算的模为256=2^8。

在没有符号位的情况下,127+2=129,即:

这时,我们将最高位作为符号位,计算机数字均以补码来表示,则1000 0001的原码为减1后按位取反得1111 1111,也就是-127。

也就是说,计算机里的129即表示-127,相当于模256为一圈,顺时针的129则和逆时针127即-127是一样的。

故可以得到以下结论:

负数的补码为 模减去该数的绝对值

如-5的补码为:

-5=256-5=251=1111 1011(二进制)

同样的,临界值-128也可以表示出来:

-128=256-128=128=1000 0000(二进制)

但是正128就会溢出了,故单字节(8位)表示的数字范围为-128--127。

最后,我们来看一下,补码是如何通过模的 溢出舍弃 操作来完成 化减为加 的!

16-5=16+(-5)=11

1 0000 1011将溢出位舍去,得0000 1011(二进制)=11。

好的,本文分享就到这里,希望能够帮助到大家。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-10-09

在计算机系统中,数值,一律用补码来表示和存储。

必须掌握的是“数值与补码”的转换。

原码和反码,在计算机中,都不存在。

所以,它们,都没有任何用处,懂不懂,并没有什么关系。

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

搞懂补码,并不难。补码的来源,可以说是日常所见。

之所以难懂,就是被哪些数学不好的老外,给误导了。

你看 2 位 10 进制(0~99),计数周期是:10^2 = 100。

算式:

  25 - 1 = 24

  25 + 99 = (一百) 24

如果你只取 2 位数,舍弃进位 10^2 = 100,

+99 和-1 就是等效的。

加法和减法运算,也是等效的。

换算公式: 正数 = 负数 + 周期。

得出的正数,就是“负数的补数”。

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

计算机,每次计算的位数,是固定的。

八位机就是八位,16 位机就是 16。。。

位数,限定了之后,负数就可以用补码(正数)代替。减法运算,也就消失了。

计算机,仅用一个加法器,就能走遍天下。

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

八位的二进制是:0000 0000~1111 1111(十进制255)。

        计数周期是 2^8 = 256。

-1 的补码就是:256-1 = 255(二进制 1111 1111)。

-2 的补码就是:256-2 = 254(二进制 1111 1110)。

。。。

计算公式:

  负数的补码 = 该负数 + 周期。

  零和正数,不存在补码,直接就可以参加计算。

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

补码,就是这么计算出来的。

补码,和原码反码,毫无关系。

计算机中,也并没有原码反码,因此,就不必讨论它们。

原码反码取反加一符号位不变。。。

脑子不好用的老外,当然就要这么做了。

相似回答