文章目录
1. 数制与编码
1.1 字符与字符串
- ASCII码
- 通常用8bit表示一个字符,最高位都为0
- 共128个字符。0-31、127为控制/通信字符;32-126为可印刷字符
- 所有大写字母、所有小写字母、所有数字的编码都连续
- 汉字
- 区位码
- 国标码 = 区位码 + 2020H
- 汉字内码 = 国标码 + 8080H
- 输入编码
- 字型码
- 字符串
- 从低地址到高地址逐个字符存储,常采用’\0’作为结尾标志
- 对于多字节的数据(如汉字),可采取大小端存储模式
- 大端模式:将数据的最高有效字节存放在低地址单元中
- 小端模式:将数据的最高有效字节存放在高地址单元中
1.2 数据的校验
-
奇偶校验码
-
在信息位的首部或尾部添加一个奇偶校验位
-
校验原理
由若干位代码组成的一个字叫码字,将两个码字逐位对比,具有不同的位的个数称为两个码字间的距离。
一种编码方案可能有若干合法码字,各合法码字间的最小距离称为码距,用d表示。
当d=1时,无检错能力:当d=2时,有检错能力:当d=3时,若设计合理,可能具有检错、纠错能力。 -
奇校验码:整个校验码(有效信息位和校验位)中“1”的个数为奇数。
-
偶校验码:整个校验码(有效信息位和校验位)中“1”的个数为偶数。
偶校验的硬件实现:各信息进行异或(模2加)运算,得到的结果即为偶校验位。
-
-
海明校验码
- 具有1位纠错能力,两位检错能力
- 设计思路
将信息位分组进行偶校验一>多个校验位
一>多个校验位标注出错位置
- 校验位 P i P_{i} Pi 放在海明位号为 2 i − 1 2^{i-1} 2i−1 的位置上
- 海明码求解步骤
【例】 - 为了区分1位错和2位错,还需添加“全校位“列整体进行偶校位
-
循环冗余校验码
- 思想
数据接收方和发送方约定一个“除数”,k个信息位和r个校验位作为“被除数”,添加校验位后需保证除法的余数为0,若余数非0则出错。
左移(除数位数-1)位,模2减(异或)。
对于确定的生成多项式,出错位与余数是相对应的。
CRC码 = K个信息位 + R位余数。 - 理论上可以证明循环冗校验码的检错能力有以下特点:
1)可检测出奇数个错误
2)可检测出所有双比特的错误
3)可检测出所有小于等于校验位长度的连续错误
4)K个信息位,R个校验位,若生成多项式选择得当,且 2 R ≥ K + R + 1 2^R\geq K+R+1 2R≥K+R+1 ,则RC码可纠正1位错。
- 思想
2. 定点数的表示和运算
2.1 定点数的表示
- 原码:一个符号位表示数据的正负, 0 代表正号, 1 代表 负号,其余的代表数据的绝对值。
- 反码:正数的反码与原码相同,负数的反码是将数据位二进制位按位取反。
原码和反码的真值0有两种表示。 - 补码:正数的补码与原码相同,负数的补码是反码在最低位上加 1。
补码的真值0只有1种表现形式。让减法操作转变为加法操作,节省硬件成本。 - 移码:补码的基础上将符号位取反。注意:移码只能用于表示整数
移码表示的整数很方便对比大小
若机器字长n+1位,原码和反码整数表示范围: − ( 2 n − 1 ) ≤ x ≤ 2 n − 1 -(2^n-1) ≤ x ≤ 2^n-1 −(2n−1)≤x≤2n−1
若机器字长n+1位,原码和反码小数表示范围: − ( 1 − 2 − n ) ≤ x ≤ 1 − 2 − n -(1-2^{-n}) ≤ x ≤ 1-2^{-n} −(1−2−n)≤x≤1−2−n
若机器字长n+1位,补码整数的表示范围: − 2 n ≤ x ≤ 2 n − 1 -2^n ≤ x ≤ 2^n-1 −2n≤x≤2n−1(比原码多表示一个-2)
若机器字长n+1位,补码小数的表示范围 − 1 ≤ x ≤ 1 − 2 − n -1≤x≤1-2^{-n} −1≤x≤1−2−n(比原码多表示一个-1)
若机器字长n+1位,补码整数的表示范围: − 2 n ≤ x ≤ 2 n − 1 -2^n ≤ x ≤ 2^n-1 −2n≤x≤2n−1(和补码一样)
- 由 x 补 x_{补} x补求 − x 补 -x_{补} −x补的技巧:符号位、数值位全部取反,末位+1
- 模 - a的绝对值 = a的补数
2.2 定点数的运算
-
定点数的位移运算
- 原码的算数移位一一符号位保持不变,仅对数值位进行移位。
- 补码的算数移位一一正数的补码与原码相同,因此对正数补码的移位运算也和原码相同。
右移:高位补0,低位舍弃。
左移:低位补0,高位舍弃。 - 负数补码的算数移位规则如下:
右移(同反码):高位补1,低位舍弃
左移(同原码):低位补0,高位舍弃。
-
逻辑移位
左移右移都补零,移出位舍弃。 -
循环移位
-
原码定点数的加/减运算
加法器直接对原码进行加法运算,可能出错 -
补码定点数的加/减运算
对于补码来说,无论加法还是减法,最后都会转变成加法,由加法器实现运算,符号位也参与运算定点数的乘/除运算; -
溢出概念和判别方法
上溢:数的绝对值太大,以至大于数据编码所能表示的数据范围。
下溢:数的绝对值太小,以至小于数据编码所能 表示的数据范围。
只有“正数+正数”オ会上溢一一正+正=负
只有“负数+负数”オ会下溢一一负+负=正
符号位的进位 C s C_{s} Cs,最高数值位的进位 C 1 C_{1} C1。上溢:01;下溢:10
即:G与C不同时有溢出. -
定点数的符号扩展
- 定点整数的符号扩展
在原符号位和数值位中间添加新位,正数都添0;负数原码添0,负数反、补码添1 - 定点小数的符号扩展
在原符号位和数值位后面添加新位,都添0;负数原、补码添0,负数反码添1
- 定点整数的符号扩展
-
乘法运算
- 原码的一位乘法
1)符号单独处理:符号位=x异或y
2)在正式进行乘法之前,AC置0
3)当前位=1,则ACC加上被乘数;当前位=0,则ACC加上0
4)统一逻辑右移(ACC+MQ),高位补0
5)加上符号位 - 补码的一位乘法
符号位参与运算
所有寄存器都统一用n+2位,因此采用双符号位补码运算
1)辅助位初始为0。每次右移会使MQ的最低位顶替原本的辅助位(事实上MQ共n+2位)
2)辅助位-MQ中最低位=1时,(ACC)+[X]补;辅助位-MQ中最低位=0时,(ACC)+0;辅助位-MQ中最低位=-1时,(ACC)+[-X]补
3)补码的算数右移:符号位不动,数值位右移,正数右移补0,负数右移补1(符号位是啥就补啥)
- 原码的一位乘法
-
除法运算
- 原码除法:恢复余数法
符号位与数值位分开处理
1)会先默认上商1,如果余数为负再改上商0。并“恢复余数”。
2)ACC、MQ整体“逻辑左移”ACC高位丢弃,MQ低位补0 - 原码除法加减交替法(不恢复余数法)
加减N+1或N+2次
符号位与数值位分开处理
1)被除数-|除数| = 新余数
2)若余数为负,则可直接商0,让余数左移1位再加上|除数|,得到下一个新余数;
3)若余数为正,则商1,让余数左移1位再减去|除数|,得到下一个新余数;
4)若最终余数为负,需恢复余数
余数的正负性与商相同。 - 补码除法:加减交替法
加减N+1次
1)符号位参与运算:被除数/余数、除数采用双符号位
2)被除数和除数同号,则被除数减去除数;异号则被除数加上除数。
3)余数和除数同号,商1,余数左移一位减去除数;余数和除数异号,商0,余数左移一位加上除数。重复n次。
4)商末位恒置1
- 原码除法:恢复余数法
-
强制类型转换
无符号数与有符号数:不改变数据内容,改变解释方式
长整数变短整数:高位截断,保留低位。
短整数变长整数:符号扩展。
注:C语言中定点整数是用“补码”存储的
3. 浮点数的表示和运算
3.1 浮点数的表示
-
浮点数位数的规格化:
- 规格化浮点数:规定尾数的最高数值位必须是一个有效值。
- 左规:当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1。
- 右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时将尾数算数右移一位,阶码加1。
-
规格化浮点数特点
- 正数的尾数的原码和补码表示范围: 1 2 ≤ M ≤ 1 − 2 − n \frac{1}{2}\leq M \leq 1-2^{-n} 21≤M≤1−2−n
- 负数的尾数的原码表示范围: − ( 1 − 2 − n ) ≤ M ≤ − 1 2 -(1-2^{-n})\leq M \leq -\frac{1}{2} −(1−2−n)≤M≤−21
- 负数的尾数的补码表示范围: − 1 ≤ M ≤ − ( 1 2 + 2 − n ) -1\leq M \leq -(\frac{1}{2}+2^{-n}) −1≤M≤−(21+2−n)
- 规格化的原码尾数,最高数值位定是1;规格化的补码尾数,符号位与最高数值位一定相反。
-
IEEE754标准
E阶码部分,用移码表示,取值范围为:-126~127
M尾数部分,用原码表示隐藏表示最高位1
一般浮点数可以表示为这样的形式(S为符号位,M为小数域的值,E为指数域的值): ( − 1 ) S × 1. M × 2 E − 127 (-1)^S \times 1.M \times 2^{E-127} (−1)S×1.M×2E−127
长浮点数表示为: ( − 1 ) S × 1. M × 2 E − 1023 (-1)^S \times 1.M \times 2^{E-1023} (−1)S×1.M×2E−1023
- 当阶码E全为0,尾数M不全为0时,表示非规格化小数:
±
(
0.
x
.
.
.
x
x
)
2
×
2
−
126
\pm (0.x...xx)_2 \times 2^{-126}
±(0.x...xx)2×2−126
隐含最高位变为0,阶码真值固定视为-126。 - 当阶码E全为0,尾数M全为0时,表示真值: ± 0 \pm0 ±0
- 当阶码E全为1,尾数M全为0时,表示无穷大: ± ∞ \pm \infty ±∞
- 当阶码E全为1,尾数M不全为0时,表示非数值:“NaN”( Not a Number)
- 当阶码E全为0,尾数M不全为0时,表示非规格化小数:
±
(
0.
x
.
.
.
x
x
)
2
×
2
−
126
\pm (0.x...xx)_2 \times 2^{-126}
±(0.x...xx)2×2−126
3.2 浮点数的加/减运算
- 浮点数加减运算步骤:
- ①对阶
使两个数的阶码相等,小阶向大阶看齐。尾数毎右移一位,阶码加1。 - ②尾数加减
通常采用双符号位表示尾数,这样可以挽救尾数溢出 - ③规格化
左规:尾数最高数值位为无效位时,尾数左移,阶码减1
右规:尾数双符号位不同时,尾数右移,阶码加1 - ④舍入
- “0”舍“1”入法:类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规
- 恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。
- ⑤判溢出
- ①对阶
4. 算术逻辑单元ALU
4.1 串行加法器和并行加法器
- 1位全加器的设计
本位和: S i = A i ⊕ B i ⊕ C i − 1 S_{i}= A_{i} \oplus B_{i} \oplus C_{i-1} Si=Ai⊕Bi⊕Ci−1
本位向高位的进位: C i = A i B i + ( A i ⊕ B i ) C i − 1 C_{i} = A_iB_i+(A_i \oplus B_i)C_{i-1} Ci=AiBi+(Ai⊕Bi)Ci−1 - 串行加法器
位全加器+进位触发器,只能一位一位地加 - 串行进位的并行加法器
多个全加器简单串联,可多位同时加;计算速度取决于进位产生和传递的速度
串行进位又称为行波进位,每一级进位直接依赖于前一级的进位,即进位信号是逐级形成的。
4.2 算术逻辑单元ALU的功能和结构
- 用4片74181芯片可以组成16位ALU,其片内进位是快速的,但片间进位是逐片传递的,即组内并行、组间串行,是单级先行进位。
- 若把16位ALU中的每四位作为一组,将74181与74182芯片配合,用类似位间快速进位的方式来实现16位ALU,则能得到16位的两级线性进位ALU,即组内并行、组间并行,是二级先行进位。