• 补码的用途


         负数在内存中是以其绝对值的反码+1,并带上符号位存储。
         根据存储内容获取原值的过程即为反运算过程,如下:
         
         1.除符号位外,其他位减1;
         2.把1的结果按位取反
         3.再把2的结果带上符号位即该负数的实际数值
         求1111 1111 1111 1111 1111 1111 1111 0110的值实际表示
            111 1111 1111 1111 1111 1111 1111 0110
    减 000 0000 0000 0000 0000 0000 0000 0001 ------------------------- 111 1111 1111 1111 1111 1111 1111 0101 ------------------------- 按位取反 000 0000 0000 0000 0000 0000 0000 1010 - ------------------------ 1 000 0000 0000 0000 0000 0000 0000 1010 ------------------------- 结果 -10


    数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为

    (-127~-0 +0~127)共256个.

    有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits

    ( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10

    (00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确.

    因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码.反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:

    ( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10

    (00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有问题.

    ( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10

    (00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正确

    问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.

    于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:

    (-128~0~127)共256个.

    注意:(-128)没有相对应的原码和反码, (-128) = (10000000) 补码的加减运算如下:

    ( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10

    (00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确

    ( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10

    (00000001) 补+ (11111110) 补= (11111111)补 = ( -1 ) 正确

    所以补码的设计目的是:

    ⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.

    ⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计
  • 相关阅读:
    47 在 Java 程序中怎么保证多线程的运行安全?
    46 线程池中 submit() 和 execute() 方法有什么区别?
    前端能力和后端能力
    在HTML中限制input 输入框只能输入纯数字
    footer固定在页面底部的实现方法总结
    在网站建设的时候需要考虑哪些因素?
    CENTOS中cat命令中文乱码 VIM乱码设置
    腾讯实验室LAMP搭建DZ
    运算符总结
    Typora专业写手都在用
  • 原文地址:https://www.cnblogs.com/yoran-yang/p/4279837.html
Copyright © 2020-2023  润新知