本帖最后由 小张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: |