美文网首页
计算机二进制补码为什么是原码取反加一

计算机二进制补码为什么是原码取反加一

作者: zh_harry | 来源:发表于2018-10-20 11:26 被阅读0次

为什么需要补码

在真实世界里,常常需要负数。如果存储在存储设备中的最小值为0,那么计算机如何存储负数呢?这个问题不是存储问题,而是程序设计人员的解释问题,类似这样的问题在后边的存储设备中也存在( 关注下一篇)

百科概念

计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

从百科解释来看是为了减少硬件电路设计,这是最终目的。从设计目的来看实在感慨设计师的巧妙。

下面我们分析一下,为什么原码取反加一就能够减少硬件电路,换句话说,为什么取反加一就可以将减法转化为加法?

定义和原理

从百科来看,给补码下个定义比较困难,就好比解释什么是筷子一样。我们可以抛开计算机,从人类社会数学的概念出发,给补码定义如下:
所谓补码就是某个数n,这个数加上-n=0。这也是补码的基本原理。
我们将二进制的首位为0解释为正数,1解释为负数

补码.jpg
13    00001101
-13   11110011(补码)
---------------
    1 00000000

直接从以上等式来看,13和-13之间除了符号位不一样,其实位之间并无关系。而实际上他们之间的关系十分微妙。
这里可能有人会想,为什么不直接将符号位取反即表示负数?比如+13(+一般省略)和-13在十进制中就是符号不一样。

理论上单纯从解释的角度出发没有问题

00001101 (+13)
10001101 (-13)

但无法将该种解释通过加法来实现减法.(因为二进制相加之后不为0)

那么这种微妙的关系是什么呢?

通过补码的定义
n+(-n)=0
这里的(-n)即为补码.我们反推过来,这里n已知,0已知(00000000).
如何求-n?
我们知道给定一个数n,让这个数变为0有两种办法

  • 做减法,将这个数的每一位减1,这个办法在百科的概念中可以被否决,因为要增加硬件成本.
  • 做加法,让结果溢出后即为0

根据第二种办法我们得出
最大的数+1即可溢出为0

那么n+(-n)=0 成立,-n推导如下

已知
   0=(11111111+1)

   11111111
          1
------------
 1 00000000
=> 

n+(-n)=(11111111+1)
已知
    n|~n=11111111
    n+(-n)=(n|~n)+1
    n+(-n)=(n+~n)+1(二进制按位或即按位相加)
=>
    (-n)=~n+1 (等号两个n抵消)

总结

通过以上分析,真的感慨计算机大师的微妙设计。
通过数学的巧妙设计使cpu中不需要减法器电路以减少设计成本。

相关文章

  • 负数在内存中的表示方式

    在计算机中数值是以二进制补码形式存在的。 正数的补码不变 负数的补码为 原码 ->取反 -> 加一以 -112...

  • 原码、反码、补码

    计算机中数值以补码形式存放原码反码:符号位不变,数值位在原码上取反补码:符号位不变,数值为在原码上取反并加一(反码...

  • 补码与反码

    计算机中存储数据 都是以 补码的形式存储 正数: 补码 = 原码 负数 : 对应正数的原码 --> 取反 -...

  • 按位异或运算 (正数异或负数) 、按位非(~)

    正数反码:与原码相同 负数反码:符号位为“1”,数值位按位 取反。 正数补码:与原码相同 负数补码:求反加一 记住...

  • 进制关系

    各进制的形式 正数的原码、反码、补码相同 负数的反码为原码各位取反,补码为反码+1 计算机的底层都是以补码的方式来...

  • JAVA中负数的二进制表示

    计算机对有符号数(包括浮点数)的表示有三种方法:原码、反码和补码,反码=原码按位取反 补码=反码+1。 移码为补码...

  • 2018-10-22 Python31 原码、反码、补码

    原码、反码、补码 1)如何计算补码?规则: 正数:原码 = 反码 = 补码负数:反码 = 符号位不变,其他位取反补...

  • 计算机二进制补码为什么是原码取反加一

    为什么需要补码 在真实世界里,常常需要负数。如果存储在存储设备中的最小值为0,那么计算机如何存储负数呢?这个问题不...

  • 《Oracle Java SE编程指南》07-09:原码、反码和

    内容导航: 前言 1、原码 2、反码 3、补码 前言 原码、反码和补码是计算机存储一个具体数字的二进制编码方式。 ...

  • [计基]-二进制之补码

    一.基础名词 原码 : 0011 反码 :0011(原码) >> 1100(反码) (原码按位取反) 补码 :00...

网友评论

      本文标题:计算机二进制补码为什么是原码取反加一

      本文链接:https://www.haomeiwen.com/subject/ktopzftx.html