首页 > 代码库 > 为什么要使用原码、反码、补码和移码
为什么要使用原码、反码、补码和移码
上篇博客简单的介绍了计算机中原码、反码、补码和移码的表示方式(http://blog.csdn.net/xdd19910505/article/details/40424533),对于计算机为什么要这样还不是很明白,就好像知道这样一个东西,却不知道为什么要这样。就好像一个人你不了解他不是他的朋友,他的有些事情你就不知道他是为了什么……
其实从原码到补码是一个层层递进的关系,也是一个在错误中逐步发展的过程。也就是说利用原码运算减法时出现的错误,为了解决出现了反码运算,但是反码运算时又出现了让人不满意的地方,于是为了更好的追求出现了补码。
模、补数的出现
初中还是高中或者是小学让我们知道了这样一件事情:
把某物体左旋转 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
为什么要使用原码、反码、补码和移码