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

 今天在上数电(没错,就是数电)第一节课上,关于一个关于补码的问题,引起了我的一点小小思考。

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


接下来是正文:

先介绍补码:

正数补码是本身,负数补码则是取反(包括符号位)然后加一;

例:

原: 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.补码源码的相互转换具有可逆性。

当然,这些只是我站在巨人的肩膀上对补码的理解,不过在理清了思路之后,不得不慨叹当年的计算机科学家思维博大深邃!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值