找回密码
 立即注册
大科技语录:
查看: 1768|回复: 5

我对补码的一点理解

[复制链接]
发表于 2011-8-2 15:32 | 显示全部楼层 |阅读模式
本帖最后由 小张haha 于 2011-8-2 15:33 编辑


    刚刚学习c语言,接触补码时,有些不解,计算机为什么要把减法变成加法来运算呢?一步到位,处理速度不更快么?后来查了资料才知道,这与计算机本身的计算结构有关,减法变加法,物理方面更容易实现。但补码是怎样把减法便加法的呢?本人思考了一下,有如下心得:

我们先来看一道题:59-18=47      就是  0011 1011     59

                                                          +  1110 1110     -18的补码

                                                        ————————

                                                            1 0010 1001     47

-18的原码是1001 0010   补码是1110 1110    最高位是符号位,但计算机在计算的时候是把符号位看成一个数的,也把它当做一个数进行计算,因此计算机计算时把1110 1110看作是238.我们知道1111 1111=255,那么把按照最高位不变取反加一的原则,1001 0010变成补码的过程就是255-18+1=238,实际上这里就是256-18,对,256,看到这里你就知道(为什么计算机要自动舍弃上面那个红色的一了吧。整个过程就是
255-18+1+59-256,计算机就是利用补码把把-18加上256
变成一个中间数,然后再利用自动舍弃减去256来完成减法运算的。

上面说的是正数减负数的情况,其它情况万变不离其宗。可见计算机巧妙的利用了补码来进行减法的运算。


    再深入一点,如果我们把补码的概念运用到其它进制中去呢?先来看看角度制,90°270°是同一角,只是表现形式不同,就像计算机的补码一样,虽然外在不同,但其本质并没有变。
再来看看十进制的反码(这里不用补码是因为补码是二进制特有的),18就是100-18=82,我们来进行一下运算59-18=47   用反码就是100-18+59=1 47  我们像计算机一样,把最高位去掉,也得到了正确结果47,但除了二进制的其它进制使用反码就显得多余了,因为还是进行了减法运算,但计算机就不同,由于其二进制的机制,补码时只有把开路变成断路,把断路变成开路再加一就行了。这样,在物理层面上容易实现,也解决了计算机在计算时有效避开最高位是符号位进行计算的问题。

再来看看二进制的反码,按照运算规则,-18的反码就是1 0000 0000-1001 0010=1110 1110。对,就是-18的补码。其实由于二进制的补码就是反码,只是由于二进制的特殊性,只要把它的每个位反取再加1就是它的反码了,具体原因其实上面已经说得很清楚了。就是1 0000 0000-1111 1111=1的原因。

      以上就是本人对补码的一点理解。。。。:smilies77:

评分

参与人数 1 +10 收起 理由
肆漆星 + 10 加分

查看全部评分

 楼主| 发表于 2011-8-3 23:30 | 显示全部楼层
没人顶?。。。
我自己来。。。。
回复

使用道具 举报

发表于 2011-8-4 08:52 | 显示全部楼层
呵呵,理解的蛮深刻的~
回复

使用道具 举报

发表于 2011-8-9 16:54 | 显示全部楼层
我想知道你是大一吗
回复

使用道具 举报

 楼主| 发表于 2011-8-15 20:08 | 显示全部楼层
本帖最后由 小张haha 于 2011-8-15 20:09 编辑

回复 4# 绿色草原


   
高中刚毕业,没事就学了c,这个有舍问题?
回复

使用道具 举报

发表于 2013-1-15 11:13 | 显示全部楼层
本版内这样的帖子应该被提倡
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|大科技

GMT+8.8, 2024-12-22 19:58 , Processed in 0.089321 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表