• 我对补码的一点理解


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

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

  • 相关阅读:
    This counter can increment, decrement or skip ahead by an arbitrary amount
    LUT4/MUXF5/MUXF6 logic : Multiplexer 8:1
    synthesisable VHDL for a fixed ratio frequency divider
    Bucket Brigade FIFO SRL16E ( VHDL )
    srl16e fifo verilog
    DualPort Block RAM with Two Write Ports and Bytewide Write Enable in ReadFirst Mode
    Parametrilayze based on SRL16 shift register FIFO
    stm32 spi sdcard fatfs
    SPI bus master for System09 (2)
    SQLSERVER中的自旋锁
  • 原文地址:https://www.cnblogs.com/zhsl/p/2743652.html
Copyright © 2020-2023  润新知