计算机组成原理——篇三

导学

  • 这一篇主要介绍数据运算
    jizu1

进制运算

  • 进位制是一种计数方式,也称进位计数法
  • 使用的数字符号的数目称为此进制的基数或底数,例如十进制0~9
  • 常见的还有二进制、八进制、十六进制(都是计算机喜欢的)

二进制表示

  • 看下面两个例子:
    jizu2
    • 注意是从0开始的
  • 二进制转十进制:按权展开法
    • 和上面的例子类似,基数的幂按位相乘再相加
      jizu3
    • 小数同理:从-1开始
      在这里插入图片描述
  • 十进制转二进制:重复相除法,除2取余
    jizu4
    • 对小数,则要用重复相乘法:乘2取整
      jizu5

二进制数据

  • 有符号数、无符号数,反码/原码/补码

有符号/无符号

  • 有符号数:用0表示正,1表示负
  • 无符号数:没有符号位,可视为非负数

表示法

  • 二进制的原码表示
    jizu6
    • 十进制转成二进制后即是有符号源码
    • 这样表示有两个问题:0有两种0010即+0和-0
    • 两个符号不同的操作数运算尤其复杂
  • 补码表示
    • 由于原码不好用,于是出现了正数代替负数加法代替减法的补码
    • 但是,注意,我们这里先看如何表示,不要关注运算!如果想提前理解:推荐链接
    • 补码定义:
      jizu7
    • 乍一看挺难过的吧?没事,看个例子:最前面的是符号位
      jizu8
    • 这里的n为什么是4?这个公式的原理是什么?在运算部分解释
      jizu9
  • 反码表示
    • 为了进一步揭示规律,方便后面的运算,引入反码:
      jizu10
    • 还是看个例子,套用公式:
      jizu11
  • 总结一下,直接上结论:
    • 正数三同(原补反相同)
    • 负数:
      • 原码—>补码:符号位不变,取反+1
      • 原码—>反码:符号位不变,取反
      • 反码—>补码:+1
  • 以上皆是整数,对于小数,我们主要看补码表示法
    • 小数反码定义:
      jizu13
    • 看个例子:
      jizu12

二进制运算

  • 定点数、浮点数和运算
  • 首先,不要混乱;
    • 前面是整数和小数的表示问题
    • 这的定点数和浮点数都包括了整数和小数,都是针对运算提出的概念;但二者适用场景不同
  • 这里解决前面的问题,为什么补码能够简化运算,也要考虑计算机如何存储并计算

表示

  • 定点数的表示:
    • 小数点固定在某个位置的数
      jizu14
    • 看个例子:
      jizu15
    • 如果不是纯的呢?需要乘上比例因子满足格式:
  • 浮点数的表示
    • 有的数据范围很大,定点数难以表达
    • 借助于科学计数法理解浮点数的表示格式:
      jizu16
      • 这里的 r 一般取2
      • 尾数必须是纯小数
    • 看个例子:
      jizu17
      • 注:阶码数值是二进制表示
    • 浮点数的表示范围:
      jizu18
      jizu19
    • 根据上面的范围,得到上溢下溢区间:
      jizu20
      • 单精度浮点数:4字节表示,即总共有32比特位存储这些阶码、尾数、符号
      • 双精度浮点数:8字节表示(double)
      • 后面会介绍溢出处理(要考)
  • 规格化
    • 先来看科学计数法的要求:
      jizu22
    • 类比之,浮点数要求尾数最高位必须为1,且纯小数,观察下面的例子:
      jizu23
    • 规格化时,根据浮点数的组成对号入座,无需将符号位加入尾数和阶码,数值不够补0
      jizu24
    • 浮点数必须要规格化后才能参与运算,一般流程:十进制数—>原码—>规格化
    • 后面会发现,尾数用补码运算
  • 对比
    • 浮点数在范围、精度、溢出处理、编程等方面优于定点数
    • 定点数在运算规则、成本、速度等方面优于浮点数

运算

  • 定点数加法
    • 规则如下:
      jizu25
    • 数值位和符号位一起计算,并将产生的进位丢掉
    • 看两个例子:
      jizu26
      jizu27
    • 关键:符号位参与运算
    • 双符号位法判断溢出:进位同样丢弃,符号相异表示溢出
      jizu28
  • 定点数减法
    • 减法变加法
      jizu29
    • 看个例子:
      jizu30
    • 补码的相反数:连同符号位,取反+1
  • 浮点数加减法
    • 和浮点数的表示类似,有具体的步骤规则:
      jizu31
    • 对阶:阶码按小阶看齐大阶的原则:
      jizu33
      • 舍弃最后两位,这个舍的问题后面会细说
      • 尾数用补码运算,原码表示;当然,补码表示也可!
    • 尾数求和:
      jizu34
    • 尾数规格化:
      • 左规:不满足下面的格式时
        jizu35
      • 左规可能进行多次(多次移位)
      • 上面的例子不满足格式,左规如下:
        jizu36
      • 右规:双符号位不一致时,进行右移操作(只一次),需要考虑舍入问题:
        jizu37
      • 小结:左移补0,右移补1/0(和剩下的符号位一致),阶码改变
    • 溢出判断:和定点数不同,浮点数双符号位不同不一定溢出,经过上面的尾数规格化之后根据阶码双符号位判断
      • 阶码符号位一致则未溢出
  • 浮点数运算小结:
    • 以上步骤都是程序化,总结如下:
      jizu38
  • 浮点数乘除法:(了解即可,考的很少)
    • 乘法规则:阶码相加,尾数相乘
    • 除法规则:阶码相减,尾数相除
    • 同样可分为:阶码运算、尾数运算、尾数规格化、舍入和溢出判断

小结

  • 本篇主要介绍了二进制的表示和运算,规则还是要记的
  • 第一次接触很容易混乱,但把握住一点:任何表示方法主要是为了机器运算的方便,从这一点出发可能会更容易理解这些规则
  • 对比存储器的结构便可知其中的原理,最后再解释一下补码的道理:
    • 以-11为例,先不考虑符号,二进制表示为1011,逐位求反得0100
    • 1011+0100=1111,而1111+1=10000(4位二进制数的模)
    • 相当于4位寄存器,最大能表示的数是15,此时+1就要全部清零进位
    • 结论:不管几位二进制数,取反后与原码相加再+1都会得到模
    • OK,补码代替原码计算,减法变加法,会溢出,模掉溢出部分就可以得到最终计算值,这就是底层原理
    • 可以将它理解成一个时钟,用模运算来轮回转化
    • 再来考虑符号位,结论是:符号位是计算过程中得到的规律(0表正,1表负),可以当成是数学之美吧!
  • 下一篇开始实现之前提到的重要算法

猜你喜欢

转载自blog.csdn.net/Yf_Roy/article/details/115100135