为什么要使用原码、反码、补码和移码

          上篇博客简单的介绍了计算机中原码、反码、补码和移码的表示方式(http://blog.csdn.net/xdd19910505/article/details/40424533),对于计算机为什么要这样还不是很明白,就好像知道这样一个东西,却不知道为什么要这样。就好像一个人你不了解他不是他的朋友,他的有些事情你就不知道他是为了什么……

          其实从原码到补码是一个层层递进的关系,也是一个在错误中逐步发展的过程。也就是说利用原码运算减法时出现的错误,为了解决出现了反码运算,但是反码运算时又出现了让人不满意的地方,于是为了更好的追求出现了补码。

                

为什么要使用原码、反码、补码和移码_第1张图片


模、补数的出现

        初中还是高中或者是小学让我们知道了这样一件事情:

         把某物体左旋转 90 度,和右旋转 270度,在不考虑圈数的条件下,最终的位置是相同的;

270+90=360;

          把分针倒拨 20 分钟,和正拨 40分钟,在不考虑时针的条件下,效果也是相同的;

20+40=60;

          把数字 87,减去 25,和加上75,在不考虑百位数的条件下,效果也是相同的;

25+75=100;

   ……。

          总之都是会有一定的前提不考虑,可见它们的关系就是互补。而计算得到的360、60、100就是分别在不同情况下的模。知道模,就可以求一个数的补数。

           用补数代替原数,就可以用加法代替减法,出现一个进位就是一个模的值。


二进制的模:

           有多少位参加运算,模就是1的后面加上多少个0。

例如:2位二进制数参加运算,模就是100;即2^2=4

             8位二进制数参加运算,模就是100000000;即2^8=256


二进制的补码:

求二进制数的补数,目的是往计算机里面存放。一般情况下,都是以 8 位二进制数来讨论补码。

计算时加上正数,是不需要进行求取补码的;只有进行减法(或者加上负数),才需要对减数求补码。补码就是按照 这个要求来定义的:正数不变,负数即用模减去绝对值。

例如:X = -126,其补码为 1000 0010,计算方法如下:

1 0000 0000

— 0111 1110

—————————————

1000 0010

        其实就是为了存储数据,为了计算简单。既然补码就可以做到这些了,那为什么书上还有把原码和反码写出来呢蛊惑人心呢?个人认为它们是没有太多用处的,在计算机里是不存在的,就是为了可以形象的说明二进制是怎么求出补码的,只起到一个中间计算过程的作用,要不一下子写出一个数的补码也是要转几个弯的。

                         

        其实在刚进TGB的时候老师就讲过这些东西,只是那时候并没有听老师的话自己下来画一遍,写一遍,以至于在软考的阶段对于它只有听过却没有印象。那天米老师讲算法说他会自己实实在在的写一遍计算的过程,作为我们,遇到这种事,还有什么资格懒呢?其实,当你看似简单的计算也许不懈写一遍过程,但是没有简单的这一步,在难的地方也许就不会写了,所以向老师学习吧!我们该学的还有太多……

                         

         关于数据表示,我也只是想加深一下印象,也许并不是太清楚,但却是我自己的理解……另外推荐一篇太好的博客,关于原码、反码、补码和移码的表示以及原因,都在里面了(说的比我好太多,我也是后来才发现( ^_^ ))。http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html


你可能感兴趣的:(●成长之路)