为什么要定义原码,反吗和补码
2017-11-18 · 知道合伙人数码行家
知道合伙人数码行家
向TA提问 私信TA
其实从原码到补码是一个层层递进的关系,也是一个在错误中逐步发展的过程。也就是说利用原码运算减法时出现的错误,为了解决出现了反码运算,但是反码运算时又出现了让人不满意的地方,于是为了更好的追求出现了补码。
模、补数的出现
初中还是高中或者是小学让我们知道了这样一件事情:
把某物体左旋转 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
其实就是为了存储数据,为了计算简单。既然补码就可以做到这些了,那为什么书上还有把原码和反码写出来呢蛊惑人心呢?个人认为它们是没有太多用处的,在计算机里是不存在的,就是为了可以形象的说明二进制是怎么求出补码的,只起到一个中间计算过程的作用,要不一下子写出一个数的补码也是要转几个弯的。
在计算机系统中,数值,一律采用补码表示和存储。
计算机中,根本就不使用原码和反码。
补码的功能,类似于:
时针,倒拨 3 小时,可以用正拨 9 小时代替。
利用这种思路,计算机中的负数,也可以用正数(即补码)代替。
于是,计算机中,就没有负数了。
同时,减法运算,也都不存在了。
因此,借助于补码,就能统一加减法,从而简化计算机的硬件。
这就是使用补码的原因。
------------------------
在时钟中,时针转一圈,周期是 12。
正拨 9 代替倒拨 3,其算法是:9 = -3 + 周期 12。
分针,倒拨 X 分,也可用正拨(-X + 周期 60)代替。
在三角函数中,周期是 2π。
一个负角度,也能用周期,算出等效的正角度。
如:-π/2,就可以转换成成:+3π/2。
------------------------
在计算机中,8 位 2 进制,称为一个字节。
其计数周期是:2^8 = 256。
那么:
-1 的补码是:-1 + 256 = 255 = 1111 1111(二进制)。
-2 的补码是:-2 + 256 = 254 = 1111 1110(二进制)。
。。。
正数,则必须直接参加运算,不许作任何转换。
即:正数,不存在补码。
------------------------
补码,是从计数系统的周期性,推导出来的。
补码与“原码反码符号位”,并无半点关系。
由“取反加一”学习补码,就不会理解补码的作用和产生的原因。
那么,为什么要定义原码、反码、符号位?
老外数学不好,也就只能用这些骚操作,来求补码了。