原码,反码,补码和移码

无符号数

  1. 定义:没有符号位的数值,存储单元的所有bit都用来表示数值
  2. 缺点:表示范围小,不能不表示负数,只能表示正数
  3. 相关的计算:
    • 根据存储单元的位数确定存储单元的存储范围
      以八位为例子:存储单元有8bits,则其存储的最大数:1111 1111 对应的十进制数是 (2 8 - 1) = 255,最小的数:0000 0000 对应的十进制数为0。
      有n个bit用于存储数字,则其存储范围是:0 —— (2n - 1)原码,反码,补码和移码
    • 将对应的十进制转成二进制
      类比于十进制中的个位,十位,百位的概念,二进制也有自己的位数。 可以将一个十六进制的拆结成对应的组合。
个位 十位 百位
100 = 1 101 = 10 102 = 100
第一位 第二位 第三位 第四位 第五位 第n位
20 = 1 21 = 2 22 = 4 23 = 8 24 = 16 2^n - 1^

有符号数

  1. 真值:+/- 二进制数,如-0.0001,用正负号来表示正负数
  2. 机器数构成:符号位,小数点位置,数值部分
    1. 符号位默认是数据段的最高位,0表示正数,1表示负数
    2. 小数点位置:不用特定的字符去表示小数点,而是采用约定的方式
      • 整数:小数点与数值位最后。
      • 小数:小数点在符号位和数值位之间。
    3. 数值部分的表达方式:原码表示,补码表示,反码表示,移码表示
      原码,反码,补码和移码

原码表示

  1. 结构:整数:符号位 + 数值部分(二进制)
    小数:符号位+数值部分(二进制)
    原码,反码,补码和移码
  2. 整数:原码,反码,补码和移码
  3. 小数:
    原码,反码,补码和移码
  4. 原码的问题总结:
  • 在将真值转成机器字时,先明确所给的机器字长,符号位,不够的的地方注意补位
  • 原码的0无论是小数还是整数都有两种表示方式,分别是正零和负零,浪费了一个空间,而且同一个零,有了二义性
  • 原码不便于做减法运算

原码改进——补码

  1. 问题引入:在时钟上将五点调到三点,除了减两个小时,还可以加上10个小时,时钟运算具有周期性,以12为模,超过十二,自动减去12.
    原码,反码,补码和移码
    同样的,当存储器在进行加法运算时,超过自身表示的上限,也会减去自身的模。所以补码提供了将减法变为加法的方法
    原码,反码,补码和移码
  • 一个负数,加上模等于其补数,五点到三点,-2 等于加上10,所以-2的补数是10点
  1. 补码的定义:
    • 整数:原码,反码,补码和移码
      【1】 这里是在真值的情况下,在整数的位数加一位的情况下进行运算,加上整数位数以及符号位,多余的自动舍去
      【2】 注意这里是2的n+1次方,x是二进制的真值部分,不是原码
    • 小数:原码,反码,补码和移码
    • == 注意计算机中对小数和整数的存储字长,超过的存储字长的自动舍弃==

求补码的方法

根据定义直接计算

得出最终的结果包括符号位
原码,反码,补码和移码

有原码直接求补码
  1. 正数的补码是自身;

  2. 负数的补码是除了符号位之外,所有的数值位取反,然后总体加一。

  3. 根据如下
    原码,反码,补码和移码

补码的重要性质

  1. 补码的补码是自身,根据补码求原码,直接对补码再求补码即可得到原码
  2. 正数的补码,原码是自身,负数的补码是原码除符号位之外全部取反,再加一
  3. 补码的零仅仅只有一种表示方式,同时负数比正数多一个极小的负数,1,00000,而该数在原码中无法表示
    原码,反码,补码和移码
  4. 通过补码,将减法运算转换为加法运算。

反码的表示

  1. 反码的定义
  • 整数
    原码,反码,补码和移码
    反码变为补码的末尾1,不在加,所以,减一
  • 小数
    原码,反码,补码和移码
  1. 反码的求法
  • 用定义对真值进行加减运算
  • 原码除符号位,数值部分全部取反
    原码,反码,补码和移码
  1. 反码的性质
  • 反码存在两种0,分别是正零0,000000,负零1,111111
  • 正数的原码,反码和补码是相同的,负数的补码是依次取反的
  • 反码的反码是本身,同补码,补码的本身是自身

三码小结

  1. 最重要的性质:通过y的补码,求-y的补码
    原码,反码,补码和移码
    包括符号位,每位取反,末位加一
  2. 三种码值相比较
    原码,反码,补码和移码

移码——用于直观的比较大小

  1. 问题引入
    原码,反码,补码和移码
    仅仅通过比较补码,难以直观的比较出两个数的大小关系,不便于做加减法运算,所以用移码表示。
  2. 给真值加上最大数,负数变为正数,正数变得更大,易于直观比较原码,反码,补码和移码
  3. 定义:
    原码,反码,补码和移码
  • 注意1:无论正数还是负数,都是加上2n
  • 注意2:只有整数的移码,没有小数的移码
  1. 移码的求法
  • 按照定义进行计算原码,反码,补码和移码
  • 补码和移码只是符号位相反,其余完全相同

5. 补码和移码的比较

原码,反码,补码和移码
6. 移码的零有一种表示方式,移码从零开始,一直到最大的数
7. 用移码表示浮点数的阶数