计算机组成原理(二)数据的表示和运算

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,过程如下图所示

进制转化.png

2.1.2 真值和机器数

真值:符合人类习惯的数字,即实际的带符号的数值
机器数:数字实际存到机器里的形式,正负号需要被“数字化”

BCD码大纲已经删除,这里不写出

2.1.3 字符与字符串

  • ASCII码
ASCII码.png
  • 汉字表示: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份,分别对其进行奇偶校验,校验位数目

求解步骤

  1. 由公式确定海明码的位数
  2. 确定校验位的分布:校验位放在海明位号为的位置上信息位按顺序放到其余位置
  3. 求校验位的值
  4. 纠错

海明码的检错能力2位、纠错能力1位

海明码求解.png

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的左边同反码

  1. 算数移位左移相当于×2;右移相当于÷2,规则如上
  2. 逻辑移位:左移和右移都是补0
  3. 循环移位:若不带进位位(CF),则用移出的位补上空缺,若有进位位,则最高位存放到进位位里

2.2.3.2 原码的加减运算

原码的加法运算:

  • 正+正:绝对值做加法,结果为正
  • 负+负:绝对值做加法,结果为负
  • 正+负:绝对值大的减绝对值小的,符号同绝对值大的数
  • 负+正:绝对值大的减绝对值小的,符号同绝对值大的数

原码的减法运算,“减数”符号取反,转变为加法:

2.2.3.3 补码的加减运算

补码的加减运算.png

转化小技巧

①数值位取反+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 原码的乘法运算

对两个原码

  1. 符号位单独处理,符号位结果为
  2. 数值位取绝对值进行乘法计算,实现方法:先加法再移位,重复n次

当前位=1,则ACC加上被乘数
当前位=0,则ACC加上0

原码一位乘法.png

2.2.3.7 补码乘法运算

n轮加法、算数右移,加法规则如下:

  • 辅助位- MQ中最低位= 1时,(ACC)+[x]补
  • 辅助位- MQ中最低位= 0时,(ACC)+0
  • 辅助位- MQ中最低位= -1时,(ACC)+[-x]补
补码一位乘法.png

2.2.3.8 原码除法运算

  1. 恢复余数法,实现方法:上商0/1,得到余数,余数末尾补0
恢复余数法.png
  1. 加减交替法:当余数为负时商0,并左移,再+|除数|
加减交替法.png

2.2.3.9 补码除法运算

余数和除数同号,商1,余数左移一位减去除数;余数和除数异号,商0,余数左移一位加上除数。重复n次

被除数和除数同号,则被除数减去除数;异号则被除数加上除数。

补码除法.png

2.2.4 C语言种的整数类型和类型转化

C语言中的定点整数是用补码来存储的

  1. 无符号数与有符号数的类型转化
int main(){
    short x = -4321;
    unsigned short y = (unsigned short)x;
    printf("x=%d,y=%d",x,y);  //output:x=-4321,y=61215
}

可以看出来,转化不改变数据内容,改变解释方式

  1. 不同类型长整数转化
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 数据的存储和排列

数据的存储和排列.png

2.3 浮点数的表示和运算

2.3.1 浮点数的表示

2.3.1.1 浮点数的表示格式

浮点数的真值一般表示为

其中,r是浮点数阶码的底,与尾数基数相同,E称为阶码,M称为尾数

阶码E反映浮点数的表示范围及小数点的实际位置;
尾数M的数值部分的位数n反映浮点数的精度。

尾数给出一个小数,阶码指明了小数点要向前/向后移动几位。

浮点数.png

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标准

IEEE 754标准.png

阶码真值=移码-偏移量

图片.png

2.3.2 浮点数的加减运算

浮点数的加减运算.png

2.4 算术逻辑单元(ALU)

2.4.1 串行加法器和并行加法器

  1. 一位全加器

全加器(FA)是最基本的加法单元,有加数(),加数()与低位传来的进位()三个输入,有本位和向高位的进位共两个输出

一位全加器.png

输入公式为

  1. 串行加法器

只有一个全加器,数据逐位串行送入加法器中进行运算。进位触发器用来寄存进位信号,以便参与下一次运算。

  1. 并行加法器

把n个全加器串接起来,就可进行两个n位数的相加。

并行加法器.png

你可能感兴趣的:(计算机组成原理(二)数据的表示和运算)