zoukankan      html  css  js  c++  java
  • 原码、反码、补码的用法和理解

    基本记忆

    • 原码符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
    • 正数原码、反码、补码都是一样,不变的。
    • 负数的反码是原码除符号位,按位取反。
    • 负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变(其实就是反码加1)。
    • 计算机数据以补码形式储存。

    Why

    原码、反码为什么不行?

    计算机为了效率使用加法代替减法:

    1-1 = 1+(-1)
    

    当使用原码进行计算时:

    1-1 = 1+(-1) = [0001]原+[1001]原 = [1010]原 = -2
    

    所以对计算机而言,原码无法解决减法,此时引入反码进行计算:

    计算5-3==2
       十进制     二进制原码    二进制反码
       5         0101    		 0101
     + -3        1011    		 1100
    ---------------------------------
       2         0010   	     0010
    此时值超过4bit,所以最高的1需要丢弃,丢弃后需要在最低位+1
    
    
    计算1-1==0
       十进制     二进制原码    二进制反码
       1         0001     	    0001
     + -1        1001     	    1110
    ---------------------------------
       0         1000           1111  
    得到1111(反码)==1000(原码)==-0,-0?通过反码计算会出现+0(0000)和-0(1000),一个0对应了两个码,
    

    所以使用反码会存在俩个问题:

    • 当计算结果溢出时需要额外进行+1操作,使得运算多了一步,效率降低。
    • 0存在+0和-0两种存在方式,不方便理解。

    模、互补、同余

    概念

    对于一个时钟,当你在8点时,你把时针往前拨2小时和往后拨10小时,最后时针都会停在6点。为什么?因为对时钟上时针而言,12小时即为一个模,2和10即是互为补数。

    • :一个轮回或者说一个范围,如时钟的一圈十二小时。
    • 互补: 一个数值针对某个模的互补值就是这个数值加上或者减去多少能够等于模,或者等于模的同余值。
    • 同余:对于一个模而言余数相同的数。

    作用(6-4为例)

    (被减数-减数)%模=被减数+(模-减数)%模
    比如以8为模:
    (6-4)%8 = 6+(8-4)%8 = 2
    

    所以可以得出结论:使用互补值计算出的结果与实际值其实是同余的关系。

    因为对于计算机中位数固定时,多余高位省略即相当于自动取模。如在固定4bit里:

    10010 = 0010 = 2
    

    所以我们可以得到一个公式:

    X-Y = X+(M-Y) = X+[(M-1)-Y+1] = X+[(M-1-Y)+1]
    

    对于M-1-Y可以理解为:

    	十进制   二进制
    M-1	7	1111
    -Y 	4	1100
         	0011
    --------------------
    M-1换算成二进制就是N位1,N位1减去任何一个N位的二进制就是按位取反!
    
     +1	1	0001
           	0100
    
    

    所以,通过以上演示可以认识到:

    反码:(M-1-Y)

    补码:[(M-1-Y)+1]

    所以对于X-Y就能理解为X+Y(补码)

    6-4 = 6+(8-4) = 2
    --------------------
    
    十进制	原码	反码	补码
    6       0110   0110   0110
    -4      1100   1011   1100
    2	0010   0010   0010
    

    注意计算后的数也是补码,如果是负数还需要转回原码。

  • 相关阅读:
    设计模式学习--面向对象的5条设计原则之单一职责原则--SRP
    设计模式学习--面向对象的5条设计原则(转)
    oracle 存储过程创建报错 Procedure created with compilation errors
    查看临时表空间占用最多的用户与SQL
    查看表空间文件以及利用率、修改、删除表空间文件大小
    aliyun阿里云alibabaMaven仓库地址——加速你的maven构建
    快速配置java环境变量
    oracle 月份中日的值必须介于 1 和当月最后一日之间
    Oracle 修改dmp的表空间
    oracle 空表导出dmp会报错
  • 原文地址:https://www.cnblogs.com/AkimotoAkira/p/13818845.html
Copyright © 2011-2022 走看看