关于补码的一些知识

发布于:2022-12-08 ⋅ 阅读:(1107) ⋅ 点赞:(0)

注:本人仅从个人学习过程中的一些体会来简单谈谈,其解释并未是真正准确的。所以欢迎读者指教。

关于补码的出现,我总结大致是2点:

1.解决计算机中有符号位时负数的问题

2.统一计算机中0表示的矛盾问题


0x01:问题的引出:

我们知道在计算机中,最早是通过原码进行加法运算(其实传闻计算机早期是有减法运算的程序,不过由于编译太过复杂,设计者就干脆把减法删除掉了,所以减法运算都要转化成加法运算)这也恰巧有个符号位可以替换减法中的“-”。(这很奇妙)

现在,我们探索尝试下原码解决正负数的加法,看看会有哪些问题。举例:1-2=-1;写成1+(-2),即0001+1010=1011(-3);很明显是可行的;再来2-1=1,若直接写成2-1->0010-1001结果-1;若写成2+(-1)即0010+1001=1001, 结果竟然是-3了,这里无论直接写成2-1还是2+(-1)都是不行的。很明显这里便产生了矛盾,这个矛盾就是负数表示成有符号位时去运算引起的。

思考:虽然符号位可以用来将原码形式下的加法运算变成减法运算,但这也并未全部准确

不仅如此 ,当如果要表示0,到底是0000还是1000还是都可以呢?

聪明的科学家们便想出了补码的概念!

一般正数的补码就是其原码本身;负数的补码是其反码再加一。

正数反码就还是其本身;负数的反码就是其符号位不变,其它位按位取反。

思考:很明显,从一般逻辑上来看,聪明的科学家们认为无符号位的正数来进行加法运算时,是不会产生问题的,虽然有2-1,但这也涉及了有符号位。所以可以规定 “正数的补码就是其本身”。而涉及到有符号位的负数运算时就会有矛盾产生(比如2-1);所以规定了 “负数的补码是其反码再加一”。至于为啥请先看完文章后自己再捋一捋。

这里我想强调的是

1.反码的出现只是为了更好的解释补码的概念。

2.“负数的补码是其反码再加一”  只是用来计算负数补码的一个口诀而已,补码的真正定义是需要结合补码的原理和思想去解释的。(额,这里我也解释不太清楚,它是有一个分段函数的,大学的数字电路这本书上有,等我回寝室看看怎么好讲再加上去哈)

3.关于计算时的符号位的借位问题:

“负数的补码是其反码再加一”这里就跟时十进制差不多,不同的是:如果是4位二进制的运算,最高位(就是符号位)是可以想它左边去借位的(如果有个0-1 这里就是有符号位所产生的问题,不必纠结。)儿相加超过2,也可以进位,进位时就相当于溢出(关于溢出,是一个很深奥的问题。打个比方,如果王者荣耀关于溢出的问题没有得到好的解决,那么你打着打着,升个级,就可能突然闪退掉。所以大厂里都是由专门关于溢出问题的专业团队的)

0x02:补码的强大

以上所讲,都是为了引出原码,我们直接用原码的口诀,验证用补码的形式:2+(-1)->0010-1111=0001(最高位1溢出可以直接不管)又由于正数的补码就是其本身,所以结果就是1,答案验证正确。

特别注意:补码运算得到的结果还是补码,需要转化成原码才能得到十进制数字。千万不要惯性思维哦。

以上所讲,可以大致证明我总结得第一点了。

0x03:补码的巧妙

由于原码形式下的0000和1000的矛盾,我们尝试用补码来进行探索验证。

嗯........这里呢,我从数据类型,数值范围中来谈谈。

我们知道当数据类型为short时,其位数是16,数值范围-2^15-2^15-1。这里我们从数值范围来入手(先写出来证明后面再看)

在补码的形式下:对于16位二进制数,正数最大为0111.....(后面15个1)。其实这里正好就是一个等比数列,而n从0开始(因为等比数列就是这么规定的)所以1*2^14+1*2^13+.......+1*2^0=2^15-1.

从理论上来看:从-1开始求和,最小的应该是-2^15+1,但为啥是-2^15呢?

1.原码1....(16个1)表示成补码10.....(14个0)1. 这样得到的是-2^15+1这个值。

2.其实之前,算正数是,0并没有计算到2^15-1里面去,所以就干脆把它纳入到负数(0表示成了10.....(15个0))里,在-2^15+1和-2^15之间取更小的值,就是-2^15。

3.而且科学家人为规定了10.....(15个0)是没有原码的,只有补码的形式且规定为0.

这就相当于一个时钟,转一圈,开始不算0,0到6计数为6,6到12计数为6。那么0呢?是算到哪个里面呢?这样我们就干脆规定一下一个特殊的值,而且它它只有补码没有原码。

这样规定解决了原码有符号位形式下  0000和1000的矛盾。

特别注意:这里我没太搞懂,聪明的科学家们为啥要这么规定。但是科学家们这样规定肯定是符合所有运算规律的。

或许你去看看补码的原理能够帮助你。

而unsigned short类型的,单独来看,它是可以用无符号来表示,所以其数值范围是2^16-1.

  其实我感觉要把补码的原理和运算都融会贯通,还是很有难度的。不过我们只需了解大概就可以,如果你将来想从事有关二进制的工作,就得好好找论文了解了解。

 思考:我们从头来看,无不惊叹于最初科学家们的探索精神和探索出来的成果。对于未知事物的探索,永远都吸引着一批又一批的人们从事其研究。

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告


今日签到

点亮在社区的每一天
去签到