计算机组成原理-第三章复习

进制转换

2进制转8进制

从小数点开始向左向右,3个一组换算成8进制,缺位补0。

如例3.4

8进制转2进制

将一位8进制数换算成3位2进制数。

如例3.6

2进制转16进制

从小数点开始向左向右,4个一组换算成16进制,缺位补0。

16进制转2进制

将一位16进制数换算成4位2进制数。

8进制转16进制(拓展)

从小数点开始向左向右,2个一组换算成16进制,缺位补0。可以先变成2进制,再变成16进制。

如表3.1

2进制转10进制

每位2进制数乘以它的权重,再求和。8421

如例3.1

10进制转2进制

整数部分

除2取余至商为0,先求出来的余数靠近小数点(低位)。

如例3.7

小数部分

小数部分 乘2取整至小数部分为0或满足精度要求,先求出来的整数靠近小数点(高位)。

如例3.8

机器数的表示

  • 机器数有三种表示方式:原码、反码和补码。

我们先假设机器数为小数,符号为放在最左边,小数点置于符号位和数值之间。

真值

  • ±绝对值,用$X$表示,正号有时可省略。

原码

  • 最高位为符号位,0表示正数,1表示负数,绝对值跟随其后。
  • 小数点的位置默认在符号位之后,书写时可以将小数点保留或省略。

0的原码有两种表示形式:

  • $[+0]_原=00000=0.0000$
  • $[-0]_原=10000=1.0000$

补码

  • 正数的补码与其原码一样
  • 补码零的表示形式唯一:$[+0]_补=[-0]_补=00000=0.0000$

负数原码补码互求

  1. 符号位不变
  2. 数据位按位取反
  3. 末位+1

加法

若加法运算不超过机器范围时:

  • 加法结果仍为补码

  • $[X+Y]_补=[X]_补+[Y]_补$

    $[X-Y]_补=[X]_补+[-Y]_补$

  • 符号位也参与运算

由$[Y]_补$求$[-Y]_补$

  1. $[Y]_补$所有位取反
  2. 末位+1

证明$[X+Y]_补=[X]_补+[Y]_补$

补码定义:

  1. $X>0,Y>0$

    可知$X+Y>0$,所以$[X+Y]_补=X+Y=X_补+Y_补$。

  2. $X>0,Y<0$

    $[X]_补=X$

    $[Y]_补=2+Y$

    $[X+Y]_补=X+Y=X_补+Y_补$

  3. ==待续==

反码

  • 正数的反码与其原码一样

负数原码反码互求

  1. 符号位不变
  2. 数据位按位取反

加减法运算的溢出判断

有进位$\neq$溢出

只有两个同号数相加或两个异号数相减,才有可能溢出。

定点运算器中,无论双符号位还是单符号位,必须有溢出判断电路,它一般由异或门来实现。

以下为三种方法(双符号位法较重要):

  • 当符号相同的两数相加时,结果的符号与加数或被加数不相同,则为溢出。

  • 当任意符号两数相加时,如果$C\neq C_f$,则为溢出,即溢出条件为$C\bigoplus C_f$,其中$C$为数值最高位的进位,$C_f$为符号位的进位。

  • 采用双符号位$f_{S2}f_{S1}$,正数双符号位为00,负数双符号位为11。

    两个符号位都参与运算,如果结果$f_{S1}\neq f_{S2}$,则为溢出,即溢出条件为$f_{S1}\bigoplus f_{S2}$。

    若采用双符号位,运算结果的符号位为高符号位$f_{S2}$。

浮点数

浮点数指小数点位置可浮动的数据,通常以下式表示:

  • $N$

    浮点数

  • $M$

    尾数,mantissa

  • $E$

    阶码,exponent(幂)

  • $R$

    阶的基数,radix(进制、基数),$R$为一常数,在一台计算机中,所有数据的$R$都是相同的,不需要在每个数据中表示出来。

浮点数的机内表示一般采用以下形式

格式 $M_S$ $E$ $M$
位数 1 $n+1$ $m$
说明 尾数的符号位 阶码,其中最高位为符号位,表示正阶或负阶 尾数

尾数规格化

  • 定义

    为了保证(极高)数据精度,尾数通常用规格化形式表示:当$R=2$,且尾数值不为0时,尾数绝对值应$\geq(0.5)_{10}$。

  • 方法

    对非规格化浮点数,通过将尾数左移或右移,并修改阶码值使之满足规格化要求。

    尾数左移几位,阶码也减少几;尾数右移几,阶码就增加几。

  • 机器零

    当一个浮点数的尾数为0或阶码的值比在机器中表示的最小值还小时,计算机都把该浮点数看成零值,称为机器零

在多数通用机中,浮点数的尾数原码或补码表示,阶码补码移码表示。

移码

  • $[X]_补$符号位取反后即为$[X]_移$。
  • 计算机中,移码(阶码)只进行加减法运算,且需要对得到的结果进行修正,即对结果的符号位求反
  • 数据零有惟一的编码,$[+0]_移=[-0]_移=1000\dots0$。当数据小于计算机能表示的最小值时,称为机器零,将阶码(移码)置为$0000\dots0$,且不管尾数值是多少,都按浮点数下溢处理。

数值范围和精度

  • 定义

    • 数值范围

      机器所能表示的一个数的最大值和最小值之间的范围

    • 数据精度

      一个数的有效位数

  • 常用浮点数(IEEE754国际标准)

    基数$R$为2,阶码采用移码(也称增码),尾数采用原码。因为规格化原码尾数的最高位恒为1,所以不再尾数中表示出来,计算时在尾数前边自动添上1。

    | 浮点数类型 | 阶码 | 尾数 |
    | :———————————: | :———: | :—————————-: |
    | 单精度浮点数(32位) | 8位 | 24位(内含1位符号位) |
    | 双精度浮点数(64位) | 11位 | 53位(内含1位符号位) |

浮点数的加减法运算

有5步操作,如下:

  1. 对阶

    阶码较小的浮点数尾数右移$\Delta E$位,其阶码值加上$\Delta E$。

    尾数原码表示的,是无符号移位

    尾数补码表示的,是带符号移位。(上边也讲了补码的符号位参与运算嘛)

  2. 尾数的加减运算

    两尾数进行加减运算,得到两尾数之和/差。

  3. 规格化操作

  • 左规

    如果结果两符号位值相同,则尾数加减结果未溢出

    但若最高数值位与符号位相同,此时尾数连续左移,直至最高数值位符号位的值不同为止,同时从阶码中减去移位的位数。

  • 右规

    如果结果两符号位值不同,则尾数加减结果溢出。此时将尾数结果右移1位,阶码+1。

  1. 舍入

    作用:处理尾数右移(右规或对阶)时丢失的低位。

    丢失的最高位为1时,在尾数末位+1,如果加1使尾数溢出,就再进行一次右规。

  2. 检查阶码是否溢出

    阶码溢出表示浮点数溢出。

    若阶码下溢,则置运算结果为机器零(通常尾数和阶码全部置0);若上溢,则置溢出标志。

定点原码一位乘法

定点补码一位乘法

定点原码一位除法

奇偶校验码

原理

码距:根据任意两个合法码之间至少有几个二进制位确定,若仅有1位不同,则称其码距为1。

使码距由1增加到2。

方法

为1个字节(8位)补充1位到高位,称为校验位;低8位为数据位

添加校验位,使1的个数奇数时,这种方法称为奇校验;使1的个数偶数时,称为偶校验

  • 奇校验

    若数据位中有奇数个1,校验位为0;若有偶数个1,校验位为1。

  • 偶校验

    若数据位中有奇数个1,校验位为1;若有偶数个1,校验位为0。

功能

  • 发现1位或奇数个位错
  • 不能确定哪一位错,也不能发现偶数个位错。

记住第一句话即可,它的功能只有第一句话,所以第二句可有可无。

海明校验码

原理

海明校验码基于偶校验

在数据中加入$r$个校验位,并把数据的每一个二进制位(共$k$个数据位)分配在几个奇偶校验组中,即一个数据位由多个校验位校验

  • $2^r$:$r$个校验码可以表示$2^r$个信息。
  • $-1$:用1个信息表示没有错误。
  • $-r$:错误也可能发生在$r$个校验位。

方法

$k$为数据位个数,$r$为校验位个数,$m=r+k$,即海明码的位数。

海明码(Hamming Code)为$H_mH_{m-1}…H_2H_1$。

  • $H_i$为第$i$个海明码位。
  • $P_i$为第$i$个校验位(Parity Bit)。
  • $D_i$为第$i$个数据位(Data Bit)。

确定校验位的位置

每位海明码由多个校验位校验,规律如下式:

由上式可知,第$i$个校验位$P_i$的海明码位号为$2^{i-1}$或最高位,海明码的其他位为数据位。

确定校验位的表达式$P_i$

根据偶校验原理可得:

确定校验和表达式$S_i$

若某校验和的值为0,说明该组没有错。若所有校验和值为0,则海明码没有出错

纠错

根据所有校验和的值及其表达式,是可以判断出哪一位出了错的。

功能

发现一位错并纠正。

若想发现两位错,则应再增加一个校验位$S’$,即书上例子里的$S_5$,用来判断是奇数还是偶数个出错。

若$S’$为0,则说明偶数个出错;若为1,则奇数个出错。

偶数个出错时,若$S_i$都为0,即$S$的值都为0时,则没有出错。

循环冗余校验码

模2运算

模2加减

即异或。

模2乘

按模2加求部分积之和。

模2除

按模2减求部分余数。

每求一位商应使部分余数减少一位(即不要最高的一位),并在低位补0。

当部分余数首位为1时,商取1,减数取除数;

当部分余数首位为0时,商取0,减数取0。

编码方法

数据说明

$(n,k)码$,其中高$k$位是数据位;后$r$位是校验位(与奇偶校验不同);$n=k+r$为CRC码的长度。

令$M$为数据位;$G$为生成多项式(Generator Polynomial),它有$r+1$位。

编码

$M$左移$r$位得$M’$,$M’$模2除以$G$。

设所得余数(Remainder)为$R$,$r$位;商(Quotient)为$Q$。

$M’$加上$R$即得CRC码。

纠错方法

判断错误

CRC码模2除以$G$是可以除尽的。

若余数为0,则无误;

若余数不为0,则某一位出错,且不同位出错,余数不同。

余数与出错位对应关系不变,只与码制和生成多项式有关。

纠错

得到一个不为0的余数后:

在其右侧补0,继续除下去(余数的变化是规律的),每除一次的同时将CRC码循环左移。

循环该操作至余数为101($G$为1011时),此时出错位在最高位。


作者:@臭咸鱼

转载请注明出处:https://chouxianyu.github.io

欢迎讨论和交流!