zoukankan      html  css  js  c++  java
  • 我对补码的一点理解

             刚刚学习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的原因。

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

  • 相关阅读:
    欧拉回路 定理
    UESTC 1087 【二分查找】
    POJ 3159 【朴素的差分约束】
    ZOJ 1232 【灵活运用FLOYD】 【图DP】
    POJ 3013 【需要一点点思维...】【乘法分配率】
    POJ 2502 【思维是朴素的最短路 卡输入和建图】
    POJ 2240 【这题貌似可以直接FLOYD 屌丝用SPFA通过枚举找正权值环 顺便学了下map】
    POJ 1860【求解是否存在权值为正的环 屌丝做的第一道权值需要计算的题 想喊一声SPFA万岁】
    POJ 1797 【一种叫做最大生成树的很有趣的贪心】【也可以用dij的变形思想~】
    js 实现slider封装
  • 原文地址:https://www.cnblogs.com/zhsl/p/2743652.html
Copyright © 2011-2022 走看看