二进制码的补码,二进制补码作用大吗,二进制和补码

  二进制码的补码,二进制补码作用大吗,二进制和补码

  问一个基本问题。

  负数在计算机中是如何表示的?比如8在计算机中表示为二进制1000,那么-8怎么表示呢?

  很容易认为一个位可以指定为符号位。等于0时表示正数,等于1时表示负数。例如,在8位机器中,每个字节的最高位被指定为符号位。那么,8就是00001000,-8就是10001000。

  但是,任何一个《计算机原理》的副本都会告诉你,其实2的补码(二进制补码)是用来表示计算机内部的负数的。

  2的补数是多少?这是一种数值转换方法,分两步完成:

  第一步,每个二进制位取相反的值,0变成1,1变成0。例如,00001000的相反值是1110111。

  第二步。将上一步获得的值加1。1110111变成了1111000。

  所以,00001000的二进制补码是1111000。也就是说,-8在计算机(8位计算机)中用11111000表示。

  不知道大家怎么看,我觉得很奇怪。为什么一定要用这么麻烦的方式表达负数?更直观的方式不好吗?

  昨天又在一本书上看到这个问题,然后花了一点时间在网上找资料。现在终于彻底明白了。

  首先,2的补码的好处要清楚。其实计算机用什么方式表示负数并不重要。只要能保持一一对应,负数可以用任何方式表示。所以,既然可以随意选择,就要选择最方便的方式。

  2的补码是最方便的方法。它的方便之处在于所有的加法运算都可以由同一个电路完成。

  还是以-8作为例子。

  假设有两种表示。一种是直观表象,即10001000;另一种是二进制补码表示法,即11111000。另外哪种表示更方便?

  写任意一个公式,16 (-8)=?

  6的二进制表示是00010000,所以用直观表示,加法会写成:

  0010000+10001000-10011000可以看出,如果按照正常的加法规则,会得到10011000的结果,换算成小数就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数和负数的加法,所以必须制定两套运算规则,一套是正数加正数,一套是正数加负数。从电路角度来说,做加法需要做两种电路。

  现在,让我们看看二进制补码表示。

  0010000+1111000 - 100001000可以看出,按照正常的加法规则,结果是100001000。注意,这是一个9位二进制数。我们已经假设这是一台8位机,所以最高的第9位是溢出位,会自动丢弃。所以结果变成00001000,十进制转换正好是8,是16 (-8)的正确答案。这说明二进制补码表示法可以将加法规则推广到整个整数集,从而可以用一组电路实现所有整数的加法。

  2的补数的本质在回答2的补数为什么能正确实现加法之前,我们先来看看它的本质,也就是那两步的转换方法是怎么来的。

  要把一个正数变成对应的负数,其实只要把这个数从0减去就可以了。比如-8其实就是0-8。

  8的已知二进制数是00001000,而-8可由下式求出:

  0000000-00001000-000000-000000(被减数)小于0000100(被减数),所以不够。请回忆一下小学的算术。如果被减数的一位小于被减数,我们该怎么办?很简单。就问最后一个人借1。

  所以,0000000也是借用了上一个人的1,也就是说被减数实际上是10000000,公式改写为:

  100000000-00001000-1111000进一步观察表明,1000000=11111111 1,所以上述公式可以一分为二:

  111111-00001000-1110111+0000001-1111000 2的补码的两个转换步骤就是这样来的。

  为什么正加法适用于二进制补码?其实我们想证明的是X-Y或者X (-Y)可以用X加Y的2的补码来做。

  Y ^ 2的补码等于(11111111-Y) 1。所以,x加上y的补数等于:

  X (11111111-Y) 1

  我们假设这个公式的结果等于Z,即Z=X (11111111-Y) 1。

  接下来分两种情况讨论。

  第一种情况:如果x小于y,那么z是负数。这时候我们就用2的补数对z的逆运算,找到它对应的正绝对值,然后在它前面加一个负号。所以,

  Z=-[11111111-(Z-1)]=-[1111111-(X(11111111-Y)1-1)]=X-Y第二种情况:如果X大于Y,说明Z肯定大于11111111,但是我们规定这样,

  Z=Z-10000000=X(11111111-Y)1-1000000=X-Y这证明了在正常的加法规则下,利用2的补码可以得到正负数相加的正确结果。换句话说,计算机可以通过部署加法电路和补码电路来完成所有整数的加法。

  (完)

  热 文 推 荐

  常用的设计模式汇总:最通俗易懂的讲解,看过的都懂了!

  资料分享

  java学习笔记、10T资料、100多个java项目分享

  欢迎关注您的个人微信官方账号【菜鸟名企之梦】,微信官方账号专注互联网求职面经javapython爬虫大数据后台发送“csdn* *等技术分享:

  微信官方账号* *菜鸟企业梦想后台发送“资料”可免费领取[csdn]和[百度文库]下载服务;

  微信官方账号菜鸟名企梦想java面试考点”:可领取5T优秀学习资料* *,java面经总结几十个java、大数据项目资料很全,你想找的几乎都有,010-59000。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: