2.1 数制与编码
2.1.1 进位计数制及其相互转化
r进制数:每个数码可能出现r种字符,逢r进1,每个数码位所用到的不同符号的个数称为基数,r 进制的基数为r
一个r进制数()可表示为
八进制—> 二进制:每位八进制对应的3位二进制
十六进制—> 二进制:每位十六进制对应的4位二进制
二进制 —> 十六进制:4位一组,毎组转换成对应的十六进制符号
二进制 —> 八进制:3位一组,毎组转换成对应的八进制符号
十进制—> 任意进制:整数除基取余法,小数乘基取整法
Eg:75.3,75D = 1001011B,0.3D = 0.01001… B,过程如下图所示
2.1.2 真值和机器数
真值:符合人类习惯的数字,即实际的带符号的数值
机器数:数字实际存到机器里的形式,正负号需要被“数字化”
BCD码大纲已经删除,这里不写出
2.1.3 字符与字符串
- ASCII码
- 汉字表示:GB 2312-80 :汉字+各种符号共7445个
2.1.4 校验码
2.1.4.1 奇偶校验码
由若干位代码组成的一个字叫码字。将两个码字逐位进行对比,具有不同的位的个数称为两个码字间的距离。一种编码方案可能有若干个合法码字,各合法码字间的最小距离称为“码距”。
当d=1时,无检错能力;当d=2时,有检错能力;当d≥3时,若设计合理,可能具有检错、纠错能力
奇偶校验码即由若干位有效信息再加上一个二进制位(校验位)组成校验码,校验码的取值(0或1),整个校验码(有效信息位和校验位)中“1”的个数,为奇数时称为奇校验码,为偶数时称为偶校验码
偶校验的硬件实现:各信息进行异或(模2加)运算,得到的结果即为偶校验位
2.1.4.2 海明校验码
将n个信息位分为k份,分别对其进行奇偶校验,校验位数目
求解步骤
- 由公式确定海明码的位数
- 确定校验位的分布:校验位放在海明位号为的位置上信息位按顺序放到其余位置
- 求校验位的值
- 纠错
海明码的检错能力2位、纠错能力1位
2.1.4.3 循环冗余校验码(CRC)
思想:数据发送、接受方约定一个“除数”;K个信息位+R个校验位作为“被除数”,添加校验位后需保证除法的余数为0;收到数据后,进行除法检查余数是否为0
例:设生成多项式为G(x)=x3+x2+1,信息码为101001
K为信息码的位数=6,R=最高次幂=3,N=K+R=9
信息码左移R位,低位补0(101001000)对1101做除法运算,得到110101余数001(校验位)
因此CRC=101001 001
其检错能力:
- 可检测出所有奇数个错误;
- 可检测出所有双比特的错误;
- 可检测出所有小于等于校验位长度的连续错误;
2.2 定点数的表示和运算
定点数:小数点的位置固定,如996.007
浮点数:小数点的位置不固定,如9.96007*10^2
2.2.1 无符号数的概念
无符号数:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。
n位无符号数的表示范围为
2.2.2 有符号数的定点表示
可用原码、反码、补码三种方式来表示定点整数和定点小数。还可用移码表示定点整数。
2.2.2.1 原码
原码:用尾数表示真值的绝对值,符号位“0/1”对应“正/负”
若机器字长为n+1位,则尾数占n位
源码整数范围
源码小数范围
2.2.2.2 反码
若符号位为0,则反码与原码相同
若符号位为1,则数值位全部取反
若机器字长n+1位,反码整数的表示范围
真值0有+0 和-0 两种形式
反码小数的表示范围:
真值0有+0 和-0 两种形式
2.2.2.3 补码
正数的补码=原码
负数的补码=反码末位+1(要考虑进位)
定点整数补码[x]补= 1,0000000表示
定点小数补码[x]补= 1.0000000表示x = -1
[+0]补= [-0]补= 00000000,即0只有1种表示形式
补码整数的表示范围
补码小数的表示范围
2.2.2.4 移码
移码: 补码的基础上将符号位取反
移码只能用于表示整数,移码整数的表示范围与补码相同
2.2.3 定点数的运算
2.2.3.1 移位运算
移位运算:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权,可用移位运算实现乘法、除法
原码的算数移位——符号位保持不变,仅对数值位进行移位。
- 右移:高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位≠0,则会丢失精度
- 左移:低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位≠0,则会出现严重误差
反码的算数移位——正数的反码与原码相同,负数的反码数值位与原码相反,负数反码的移位运算规则如下
- 右移:高位补1,低位舍弃。
- 左移:低位补1,高位舍弃。
补码的算数移位——正数的补码与原码相同,负数补码=反码末位+1导致反码最右边几个连续的1都因进位而变为0,直到进位碰到第一个0为止。负数补码的算数移位规则如下:
- 右移(同反码):高位补1,低低位舍弃。
- 左移(同原码):低位补0,高位舍弃。
规律——负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码
- 算数移位左移相当于×2;右移相当于÷2,规则如上
- 逻辑移位:左移和右移都是补0
- 循环移位:若不带进位位(CF),则用移出的位补上空缺,若有进位位,则最高位存放到进位位里
2.2.3.2 原码的加减运算
原码的加法运算:
- 正+正:绝对值做加法,结果为正
- 负+负:绝对值做加法,结果为负
- 正+负:绝对值大的减绝对值小的,符号同绝对值大的数
- 负+正:绝对值大的减绝对值小的,符号同绝对值大的数
原码的减法运算,“减数”符号取反,转变为加法:
2.2.3.3 补码的加减运算
转化小技巧
①数值位取反+1;
②负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码
2.2.3.4 溢出判断
溢出时指运算结果超过了数所能表示的范围
只有“正数+正数”才会上溢——正+正=负
只有“负数+负数”才会下溢——负+负=正
- 采用一位符号位
设A的符号为,B的符号为,运算结果的符号为,则溢出逻辑表达式为
若V=0,表示无溢出;若V=1,表示有溢出。
- 采用一位符号位,根据数据位进位情况判断溢出
设符号位的进位 最高数值位的进位
若V=0,表示无溢出;V=1,表示有溢出。
- 采用双符号位
正数符号为00,负数符号为11,记两个符号位为,
表示为正数,无溢出
表示正溢出
表示为负数,无溢出
表示为负溢出
2.2.3.5 符号扩展
定点整数的符号扩展:在原符号位和数值位中间添加新位,正数都添0;负数原码添0,负数反、补码添1
定点小数的符号扩展:在原符号位和数值位后面添加新位,正数都添0;负数原、补码添0,负数反码添1
2.2.3.6 原码的乘法运算
对两个原码
- 符号位单独处理,符号位结果为
- 数值位取绝对值进行乘法计算,实现方法:先加法再移位,重复n次
当前位=1,则ACC加上被乘数
当前位=0,则ACC加上0
2.2.3.7 补码乘法运算
n轮加法、算数右移,加法规则如下:
- 辅助位- MQ中最低位= 1时,(ACC)+[x]补
- 辅助位- MQ中最低位= 0时,(ACC)+0
- 辅助位- MQ中最低位= -1时,(ACC)+[-x]补
2.2.3.8 原码除法运算
- 恢复余数法,实现方法:上商0/1,得到余数,余数末尾补0
- 加减交替法:当余数为负时商0,并左移,再+|除数|
2.2.3.9 补码除法运算
余数和除数同号,商1,余数左移一位减去除数;余数和除数异号,商0,余数左移一位加上除数。重复n次
被除数和除数同号,则被除数减去除数;异号则被除数加上除数。
2.2.4 C语言种的整数类型和类型转化
C语言中的定点整数是用补码来存储的
- 无符号数与有符号数的类型转化
int main(){
short x = -4321;
unsigned short y = (unsigned short)x;
printf("x=%d,y=%d",x,y); //output:x=-4321,y=61215
}
可以看出来,转化不改变数据内容,改变解释方式
- 不同类型长整数转化
int main(){
int x = 165537, u = -34991;
short y = (short)x, v=(short)u;
printf("x=%d,y=%d\n",x,y); //output:x=165537,y=-31071
printf("u=%d,v=%d\n",u,v); //output:u=-34991,v=30545
}
长整数变短整数:高位截断,低位保留
短整数变长整数:符号扩展
2.2.5 数据的存储和排列
2.3 浮点数的表示和运算
2.3.1 浮点数的表示
2.3.1.1 浮点数的表示格式
浮点数的真值一般表示为
其中,r是浮点数阶码的底,与尾数基数相同,E称为阶码,M称为尾数
阶码E反映浮点数的表示范围及小数点的实际位置;
尾数M的数值部分的位数n反映浮点数的精度。尾数给出一个小数,阶码指明了小数点要向前/向后移动几位。
2.3.1.2 浮点数的规格化
规格化浮点数:规定尾数的最高数值位必须是一个有效值。
左规:当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1。
右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,将尾数算数右移一位,阶码加1。
用原码表示的尾数进行规格化:
- 正数为0.1××…×的形式,其最大值表示为0.11…1;最小值表示为0.10…0。
- 尾数的表示范围为。
- 负数为1.1××…×的形式,其最大值表示为1.10…0;最小值表示为1.11…1。
- 尾数的表示范围为。
用补码表示的尾数进行规格化:
- 正数为0.1××…×的形式,其最大值表示为0.11…1;最小值表示为0.10…0。
- 尾数的表示范围为。
- 负数为1.0××…×的形式,其最大值表示为1.01…1;最小值表示为1.00…0。
- 尾数的表示范围为。
2.3.1.3 IEEE 754标准
阶码真值=移码-偏移量
2.3.2 浮点数的加减运算
2.4 算术逻辑单元(ALU)
2.4.1 串行加法器和并行加法器
- 一位全加器
全加器(FA)是最基本的加法单元,有加数(),加数()与低位传来的进位()三个输入,有本位和向高位的进位共两个输出
输入公式为
- 串行加法器
只有一个全加器,数据逐位串行送入加法器中进行运算。进位触发器用来寄存进位信号,以便参与下一次运算。
- 并行加法器
把n个全加器串接起来,就可进行两个n位数的相加。