定点数的表示和运算

vampire 2020年10月08日 79次浏览

文章中数学公式显示不太正常,可移步定点数的表示和运算


定点数的表示和运算

定点数的表示

有符号数和无符号数

  • 无符号数

    机器字长的二进制位均为数值位,无符号

  • 有符号数

    最高位0/1表示正/负

机器数定点表示

  • 定点小数

    定点小数是纯小数;

    约定小数点位置在符号位之后,有效数值部分最高为之前

  • 定点整数

    定点整数是纯整数;

    小数点位置在有效数值部分的最低位之后

机器数表示方法

  • 原码表示法

    1. 最高位为符号,其余各位表示数的绝对值
    2. 纯小数的原码
      • 字长为n+1
      • 范围为 $-(1-2{-n}) <= X <= 1-2{-n}$
      • 关于原点对称
    3. 纯整数的原码
      • 字长为n+1
      • 范围为$-(2n-1) <= X <= 2n -1$
      • 关于原点对称
  • 补码表示法

    1. 补码可以更好的表示加减法
    2. 纯小数补码
      • 表示范围:$-1 <= X <= 1-2^{-n}$
      • 比原码多表示-1(1.0000)
    3. 纯整数补码
      • 表示范围:$-2n <= X <= 2n-1$
      • 比原码多表示 $-2^n$ (10000000)
    4. 补码的算数移位
      • 实现除法功能:符号位与数值位一起右移,保持原符号位数值不变
      • 变形补码:模4补码(正/负:00/11)
  • 反码表示法

    1. 原码与补码相互转化的过渡
    2. 纯小数反码
      • 表示范围:$-(1-2{-n}) <= X <= 1-2{-n}$
      • 关于原点对称
    3. 纯整数反码
      • 表示范围:$-(2n-1) <= X <= 2n -1$
      • 关于原点对称
  • 移码表示法

    1. 常用来表示浮点数的阶码,只能表示整数
    2. 最小值:$-2n$(全零) 最大值:$2n-1$(全1)
    3. 移码大,真值就大
    4. 真值零唯一表示
  • 不同表示方法之间的项目转化

    1. 正数:原码,反码,补码相同
    2. 负数:
      • 原码符号位不变,数值位取反得到反码
      • 原码符号位不变,数值位取反加1得到补码
    3. 补码符号位取反得到移码

定点数的运算

定点数移位运算

  • 算数移位

    1. 正数:移位后添0

    2. 负数:

      • 原码添0
      • 补码左0右1(从低位向高位找到第一个‘1’时分左右,‘1’包含在右)
      • 反码全部添1
    3. 符号位不参与运算

  • 逻辑移位

    1. 将操作数看做无符号数
    2. 左移或者右移都要添0
  • 循环移位

    1. 带进位标志位的循环移位
    2. 不带进位标志位的循环移位
    3. 适合将数据的低字节数据和高字节数据互换

原码定点数的加减法运算

  • 加法准则

    1. 符号相同:绝对值相加,符号不变
    2. 符号不同:绝对值大的减去绝对值小的,符号取绝对值大的
  • 减法准则

    1. 减数的符号取反,将其与被减数做原码加法运算

补码定点数加减法运算

  1. 参与的操作数均为补码
  2. 按照二进制规则运算,逢2进1
  3. 符号位与数值位同时参与运算,符号位产生的进位丢掉,结果的符号由运算得出
  4. 补码运算结果仍是补码

符号扩展

  1. 正数:在原有的基础上,添0凑位即可
  2. 负数
    • 原码:符号位为1,其余和正数相同
    • 补码:加1填充(整数)加0填充(小数)
    • 补码:加1处理

溢出概念和判断方法

  1. 上溢:大于最大可以表示的正数

  2. 下溢:小于最小可以表示的负数

  3. 补码判断溢出的办法

    • 一位符号位:

      A的符号位为$A_S$, B的符号位为$B_s$,运算结果的符号位为$S_s$

      $$V = A_sB_s\bar + \bar\barS_s$$

      V=0,表示无溢出;V=1表示有溢出

    • 双符号位

      00:结果为正数,无溢出

      01:结果正溢出

      10: 结果负溢出

      11:结果为负数,无溢出

    • 一位符号位根据数据位进位判断

      符号位与最高数位的进位相同,无溢出,否则溢出

定点数的乘法运算

  • 原码一位乘法

    1. 符号位异或,被乘数和乘数取绝对值运算
    2. 部分积取n+1位,初值为0
    3. 根据乘数的最低位$y_n$判断
      • $y_n=1$:部分积加上被乘数,右移一位
      • $y_n=0$:部分积加0右移一位
    4. 重复3,判断n次
    5. 逻辑右移,符号位不参与运算
    6. 符号位部分积2位,考虑绝对值大于1的情况
  • 补码一位乘法(Booth算法)

    1. 符号位参与运算,补码的算数右移
    2. 被乘数双符号位;部分积双符号位,初值为0;乘数取单符号位
    3. 乘数末位为$y_n$,增设$y_{n+1}$
      • 00或11:部分积右移1位
      • 01:部分积加$[X]_补$,右移一位
      • 10:部分积加$[-X]_补$,右移一位
    4. 执行n+1次,n+1次只累加,不移位

定点数的除法运算

  • 原码除数运算(恢复余数法)

    默认商1,如果余数为负,则需要加上除数,恢复正确的余数,商0;

  • 原码除数运算(不恢复余数法)

    1. 商符和商值分开,符号位不参与运算
    2. 被减数减去除数
    • 余数为正,商1,余数和商左移1位,减去除数
    • 余数为负,商0,余数和商左移1位,加上除数
    1. n+1步余数为负,是需要再加除数,得到正确的余数(余数和被除数号)
  • 补码除法运算(加减交替法)

    1. 符号位参与运算;除数,被除数,商和余数都用补码表示
    2. 被除数与除数同号,则被除数减去除数;被除数与除数异号,被除数加上除数
    3. 若余数与除数同号,商1,余数左移1位减去除数;余数与除数异号,商0,余数左移1位加上除数
    4. 重复3执行n次;加减次数总共n+1次
    5. 对商的精度没有要求,则一般采用“末位恒置1”法;

强制类型转换

  • 有符号数和无符号数的转换

    强制转化的结果二进制位值不变,改变了解释这些位的方式

  • 不同字长整数之间的转换

    1. 大字长变量向小字长变量转换
      • 高位直接截断,地位直接赋值
    2. 小字长变量向大字长变量转换
      • 负数添1
      • 正数添0

数据的存储和排列

  • 大端模式和小端模式

    1. 多字节数据存放在连续的字节序列
    2. 大端模式高字节数据放在低地址部分;小段模式相反
    3. 小端模式便于机器运算
  • 边界对齐

    1. 字节寻址可按字节、半字、字寻址
    2. 每次访存只能读/写一个字
    3. 边界对齐方式和边界不对齐方式
    4. 边界对齐空间换时间的思想