您的位置:首页 > 其它

关于补码的一点小小的思考(水)

2018-03-07 14:48 274 查看
 今天在上数电(没错,就是数电)第一节课上,关于一个关于补码的问题,引起了我的一点小小思考。
本来对于今天这节课是没什么兴趣的。其一,补码这个东西,已经学过很多遍了,而且它是计算机底层才用到的理论,心中有一点不以为然。其二,今天上课是带有目的性的(此处省略一万字),一直在思考说辞……直到偶然间听到了关于补码的讲述,心中有了一丝荡漾:在解释补码原理的时候,书上用时钟比喻补码原理的内容,触动了我:我好像在哪里见过你!

接下来是正文:
先介绍补码:
正数补码是本身,负数补码则是取反(包括符号位)然后加一;
例:
原: 0 0001 补: 0 0001
原: 1 0001 补: 0 1111
它的作用也很简单,负数在做加法时,要转化成补码,用补码相加才能得到正确的答案;
第一次学这个的时候,还是很惊讶的,因为在定义了这样一种规则之后,确实可以实现负数加法(或者说是减法)!但是,原理我当时还是不太懂。在学习了一系列的知识之后,才明白了这种方式的高明。
在以前的学习中,
我们知道,加法减法是逆运算,负数的引入,则可以将减法整合到加法中;
乘法除法互为逆运算,但是小数的引入,可以让除法转化成乘法
在解决矩阵除法的问题上,逆矩阵的引入,可以用逆矩阵作为代替进行矩阵乘法运算。
以上转化成立的原理,在此不多赘述,下面只讨论二进制的相关问题。
举个例子 12-3我们可以将它等价成(12+13)%16 显然,他们的结果都是9 。 -3 和13有什么关系呢?他们的绝对值加在一起等于16!也就是说,在一定条件下,我可以用13替代-3进行运算!此时我们可以设计一种规则去计算这个东西 :每当计算到等于16时,之前算的东西全部清零。同时我们知道,在计算机中是只有01两种数据的,不难想到,从中选取四个数码位进行运算,当计算到 1111 时,再+1就变成了0000!正好可以满足计算的要求;同时,-3 还可以由 15-3+1得到。15-3?1111-0011 = 1100 !我只要按位取反,就可以得到15-3的结果,再加一就是16-3 也就是13!但是这样无法分辨正负数,怎么办呢?在数字位之前再加上一个符号位吧!规定 负数之前为1正数前为0,然后-3 就自然的变成了 1 1101  将它和 0 1100 相加得到了 0 1001答案正确!但如果问题变成 3-12 答案是负数时是什么样的呢?-12 的补码为:1 0100,加上0 0011为 1 0111 结果是-7不对啊,怎么办呢?试试用上述方法转换回去试试:1 0111 -> 1 1000 -> 1 1001 变成了 -9!结果是正确的!那么我们想到了一个好方法:在读入数据的时候,直接将其转化为补码存储,等到计算的时候在转化成原来的值。这种编码方法简直就是神来之笔啊!这种编码可以实现:
1.正负数区分而且在运算时可以直接将符号位纳入运算之中;
2.解决了如果符号位如何处理-0这样的问题;
3.补码源码的相互转换具有可逆性。
当然,这些只是我站在巨人的肩膀上对补码的理解,不过在理清了思路之后,不得不慨叹当年的计算机科学家思维博大深邃!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: