对原码、反码、补码的理解认识

概念:
  • 机器数(真值):一个数在计算机中的二进制表示形式。机器数带符号,正数最高位为0,负数最高位为1。
  • 原码:符号位加上真值的绝对值。
  • 反码:正数的反码是其本身,负数的反码是在其基础上,符号位不变,其余各位取反。
  • 补码:正数的补码是其本身,负数的补码是在原码的基础上,符号位不变,其余各位取反,最后加1。即补码是反码的基础上加1。
 
  • 原码的减法运算:

    发现用带符号位的原码在加减运算的时候就出现问题,如下(假设字长为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)     // 存在 - 0  ,有问题
      (1)10 - (2)10 = (1)10 + (-2)10 = (-1)10
      (00000001) 反+ (11111101)反 = (11111110)反 = (-1)     // 正确
    问题出现在+0和-0上,0是没有正负之分的。于是就引入了补码概念。 在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个。
 
  • 补码的加减运算:
      (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)     // 正确
 
 
功能与目的:
 
  • 反码:解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则;
  • 补码:解决负数加法运算正负零问题,弥补了反码的不足。
  反码与补码都是为了解决负数运算问题,跟正数没关系,因此,不管是正整数还是正小数,原码,反码,补码都全部相同。
 
总结:
1、正数的原码、补码、反码均为其本身;
2、负数(二进制)的原码、补码、反码公式:
    反码 = 原码(除符号位外)每位取反
    补码 = 反码 + 1
    反码 = 补码  - 1
posted @ 2017-11-30 21:22  BooneZan  阅读(448)  评论(0编辑  收藏  举报