计算机为什么要使用原码、反码、补码

计算机为什么要使用原码、反码、补码

1. 什么是原码、反码、补码

先看一个例子: +1和-1的原码、反码、补码的表示

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

原码、反码、补码的计算方式如下:

原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

反码:正数的反码是其本身。负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

补码:正数的补码就是其本身。负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。

2. 为什么要使用原码、反码、补码

从原码、反码、补码的表示方式不难看出,原码才是人眼最直观能看出值的表示方式,那么为什么还要有反码和补码呢?

答案是为了简化计算机集成电路的设计

首先, 因为人脑可以知道第一位是符号位,,在计算的时候我们会根据符号位,,选择对真值区域的加减。但是对于计算机,,加减乘数已经是最基础的运算,,要设计的尽量简单.。计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂,于是人们想出了将符号位也参与运算的方法。我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。此外,由于现阶段计算机CPU擅长做加法运算,CPU硬件实现减法要复杂得多,而且运算效率很低,所以我们偷懒只讨论加法运算。说不定以后发明了减法加速硬件,那就另当别论了。

2.1 为什么要有反码

于是人们开始探索将符号位参与运算,并且只保留加法的方法。 首先来看原码: 计算十进制的表达式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

如果用原码表示, 让符号位也参与计算,显然对于减法来说, 结果是不正确的。这也就是为何计算机内部不使用原码表示一个数。

为了解决原码做减法的问题, 出现了反码:

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

发现用反码计算减法, 结果的真值部分是正确的.

2.2 为什么要有补码?

2.1 发现用反码计算减法, 结果的真值部分是正确的。而唯一的问题其实就出现在"0"这个特殊的数值上。 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的。 而且会有[0000 0000]原和[1000 0000]原两个编码表示0。

于是补码的出现,,解决了0的符号以及两个编码的问题:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原

这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

-1-127的结果应该是-128, 在用补码运算的结果中,,[1000 0000]补 就是-128.。但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示。(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)

使用补码,不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数。这就是为什么8位二进制,使用原码或反码表示的范围为[-127, +127],而使用补码表示的范围为[-128, 127]。

因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-2^31, 2^31-1] 因为第一位表示的是符号位。而使用补码表示时又可以多保存一个最小值。

总结一下:

为什么要有反码? 为了解决原码做减法的问题

为什么要有补码? 为了解决0有两个编码的问题,多出的一个编码用与多表示一个最低位

问题

有了补码,反码还有作用吗?

可能真的没什么作用了,只是作为原码到补码的过度状态 ?可以简单地理解为原码到补码是一个层层递进的关系,也是一个在错误中逐步发展的过程。也就是说利用原码运算减法时出现的错误,为了解决出现了反码运算,但是反码运算时又出现了让人不满意的地方,于是为了更好的追求出现了补码。

参考自:

原码、反码、补码知识详细讲解(此作者是我找到的讲的最细最明白的一个

原码、反码、补码的产生、应用以及优缺点有哪些? - 知乎

为什么计算机采用补码而不是原码或反码? - 知乎

相关推荐

如何将 iPhone 上的联系人转移到 SIM 卡上? (4种可行的方法)
日博365哪个是真的

如何将 iPhone 上的联系人转移到 SIM 卡上? (4种可行的方法)

一个马蜂窝能卖多少钱 马蜂窝会越来越大吗
365bet哪个国家的

一个马蜂窝能卖多少钱 马蜂窝会越来越大吗

中国体育彩票4月1日开奖结果
365彩票下载1.0.0老版本

中国体育彩票4月1日开奖结果

iPhone个人热点连不上? 6招解决iPhone热点连线或断线异常问题
365彩票下载1.0.0老版本

iPhone个人热点连不上? 6招解决iPhone热点连线或断线异常问题

醉鄊的解释及意思
日博365哪个是真的

醉鄊的解释及意思

如何给手机贴彩膜 手机贴膜步骤图解教程
日博365哪个是真的

如何给手机贴彩膜 手机贴膜步骤图解教程