【计算机组成原理】第2章 运算方法和运算器

来源:互联网 发布:数据分析属经济学吗 编辑:程序博客网 时间:2024/05/18 02:26

2.1 数据与文字的表示方法

2.1.1 数据样式

在选择计算机的表示方法时,要考虑
1. 数的类型(小数,整数,实数和复数)
2. 数值范围
3. 数值精确度
4. 数据存储和处理所需的硬件代价

计算机中常用的数据表示格式:1. 定点格式;2. 浮点格式
定点格式:数据范围有限,要求的处理硬件比较简单
浮点格式:数据范围较大,要求的处理硬件比较复杂

1.定点数的表示方法:

参与运算的数的小数点位置固定不变。

Xn  Xn1 ... X1 X0 符号 量值(尾数)

纯小数:

小数点在XnXn1之间。
小数点固定在最高位之后称为定点小数。若机器字长为n+1位,数值表示为:
X=Xn.Xn1 ... X1 X0,其中Xi=0,1,0in(这里Xn不表示数字,只表示符号,若Xn=0,则代表X=0. Xn1 ... X1 X0Xn=1,则代表0. Xn1 ... X1 X0
例如:1111表示-0.875
绝对值最小:各位均为0,|X|min=0;
绝对值最大:各位均为1,|X|max=12n;

纯整数:

小数点在X0右边。
绝对值最小:各位均为0,|X|min=0;
绝对值最大:各位均为1,|X|max=2n1;
PS:
0.1111111 = 1.0000000 - 0.0000001 = 1 - 27;
0 1111111 = 1 0000000 - 1 = 27 - 1;

2.浮点数的表示方法:

  1. 任意十进制N 可以写成 N=10E.M
  2. 任意二进制N 可以写成 N=2e.M
    -M 为浮点数的尾数,是一个纯小数
    -e 是比例因子的指数,称为浮点数的指数,是一个整数

IEEE754标准

S E M 31(1) 30———23(8) 22———0(23)

-S 是符号位,占1位,S = 0表示正数,S = 1表示负数。
-E 是阶码,占用8位;阶码采用移码方法来表示正负指数。
指数真值变成阶码E 时,e+127=E.
当尾数的值不为0时,尾数域的最高位应为1,这称为浮点数的规格化表示。否则以修改阶码的同时左右移动小数点位置的方法,使其变成规格化数形式。
32位浮点数x的真值表示:
x=(1)S×(1.M)×2 E127;
e+127=E.
其中尾数域所表示的值是1.M。由于规格化的浮点数的尾数域最左位(最高有效位)总是1,故这一位经常不予存储,而认为隐藏在小数点的左边。于是23位字段可以存储有效数。


例1:(754标准转化10进制)
若浮点数x的754标准存储格式为(41360000)16 ,求其浮点数的十进制数值。
将16进制转化成二进制:

S 符号位 E 阶码 M 尾数 0 100 0001 0 011 0110 0000 0000 0000 0000 31(1) 30———23(8) 22———0(23)

指数 e = 阶码 - 127=10000010 - 00000011 =(3)10
包括隐藏位1的尾数1.M = 1.011 0110 0000 0000 0000 0000 = 1.011011
x=(1)S×(1.M)×2 e=+(1.011011)×23 = +1011.011 =(11.375)10
例2:(10进制转化754标准)
将数(20.59375)10 转换成754标准的32位浮点数的二进制存储格式。
1.转化成二进制:20.59375=10100.10011
2.规格化表示:10100.10011=1.010010011×24 e=4
3.得符号位S=0,阶码E=4+127=131=10000011,M=010010011
解得:

S 符号位 E 阶码 M 尾数 0 100 0001 1 010 0100 1100 0000 0000 0000 31(1) 30———23(8) 22———0(23)

3.十进制数串的表示方法:

1). 字符串形式:即一个字节存放一个十进制的数位或符号位。主要用于非数值计算的应用领域中。
2). 压缩的十进制数串形式:即一个字节存放两个十进制的数位。节约空间,便于直接完成十进制数的算术运算,是广泛采用的较为理想的方法。每个数位占用半个字节(即4个二进制为)

2.1.2 数的机器码表示

符号位数值位一起来编码来表示相应数的各种表示方法,如原码,补码,反码,移码。
一般书写表示的数称为真值,机器中这些编码表示的数,称为机器码或者机器数。

1. 原码表示法

若定点整数的原码形式为Xn.Xn1 ... X1 X0(Xn),则原码的定义为:
[x]={x,2nx=2n+|x|,2n>x0 0x>2n
[x] 是机器数,x 是真值。
其实就是正数&&0的真值保持不变,真值为负数的原码在最左边(Xn)添1,这样一看,定义那个式子不就满足了。

例:x=1001, 则原码[x]=11001<=24(x)

2.反码表示法

简单:
正数的反码就是原码.
负数的反码就是原码的符号位不变,然后其余位上全部取反(0->1/1->0).

3. 补码表示法

补码和真值的关系:

设一个二进制整数补码有n+1 位(含1位符号位 xn),即:

[x]=xn.xn1 ... x1 x0

1.当x 为正整数的时候,

x=n1i=02ixi=0xn1 ... x1 x0

2.当x 为负整数的时候,

x=2nxn+n1i=02ixi=1xn1 ... x1 x0

3.当x 为0的时候

[x]=[+0]=[0]=0

则其补码表示的真值为[推荐补码记个公式]

x=2nxn+n1i=02ixi

例一:

已知[x]=01001,求x=
x=0×24+1×23+0×22+0×21+1×20=9

例二:

已知[x]=11001,求x=
x=1×24+1×23+0×22+0×21+1×20=7

原码转补码:

1.一个正整数,都一样
2.一个负整数,1)原码符号位不变,整数的每一位二进制求反得到反码。2)反码符号位不变,反码最低位+1,得到补码。


So, 正数的原、反、补码都一样:0的原码跟反码都有两个,因为这里0被分为+0和-0。


4. 移码表示法

移码通常用于表示浮点数的阶码。
由于阶码是个k的整数,假定定点整数移码形式为 ekek1e2e1e0(最高位为符号位)时,移码的传统定义为

[e] = 2k + e
[e]e2k

举例:

阶码数值部分是5,以 e 表示真值,则[e] = 25 + e
So:

当正数 e=+10101,时,[e]=110101
当负数 e=10101,时,[e]= 25 + e=25  110101=001011


搞到这里真的要亲切愉快地说一下,原码,反码,补码,移码的基本姿势,讲完惹!!!
现在来讨论一下,对于机器字长为 n 位,定点表示,尾数 n1 位,【对于由原码,反码,补码表示时】,符号位1位的数值范围或说一下最大整数和最大负数
1.原码:
很简单啊,
最大值,正数的话全是1(除了符号位):0...11111=2n1
最小值,还是全是1然后添个负号呗:1...11111=(2n1)
2.反码:
正数的原码和反码一样:0...11111=2n1
负数还是类似与原码:1...00000=(2n1)
3.补码:
还记得补码和真值的关系嘛?
就是符号位是减(2n),其余位都是加(+2k)
那么显然的:
正数的话,符号位不要减,其他都加了:0...11111=2n1
负数的话,符号位要减,其他都不要加:1...00000=2n【哇,好神奇啊】

IEEE754标准:
32位浮点数x的真值表示:
x=(1)S×(1.M)×2 E127;
e+127=E.
例【9】:
假设由S,E,M三个域组成的一个32位二进制数所表示的非零规格化浮点数x,真值表示为(注意此例不是IEEE格式 见上
x=(1)S×(1.M)×2 E128;

S 符号位 E 阶码 M 尾数 0 00 000 000 000 0000 0000 0000 0000 0000

1.最大正数:M大,E大,符号位0

0 11 111 111 111 1111 1111 1111 1111 1111

x=(1)0×(1+(1223))×2 127;
同理,最小正数,最大负数,最小负数。


2.1.3 字符与字符串的表示方法

字符信息用数据表示,称为符号数据。
国际版为IRA码,美国版称为ASCII码。
打印机设备可以打印95个字符;另外33个字符被用作操作码,控制计算机某些外围设备的工作特性和某些计算机软件的运行情况。

2.1.4 汉字的表示方法

汉字的输入编码

  1. 数字编码
    常用的国际区位码。实际上把汉字表示成一个二维数组。区码和位码各两位十进制数字。
  2. 拼音码
    以汉语拼音为基础的输入方法。
  3. 字形码
    字形编码是汉字的形状来进行的编码。

2.1.4 校验码

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

数据 偶校验编码C 奇校验编码C 10101010 10101010 0 10101010 1 01010100 01010100 1 01010100 0 11111111 11111111 0 11111111 1

2.2 定点加法,减法运算

2.2.1补码加法

公式:
[x]指机器码

[x]+[y]=[x+y]
证明略.

例子

例1.x=+1011,y=0101,x+y
[x]=01011
[y]=11011
[x+y]=100110
x+y=+0110
注意:①:符号位要作为数参与运算;②:超过符号位 2n+1 的位要丢掉

2.2.2补码减法

公式:
[x]指机器码

[x][y]=[xy]=[x]+[y]
证明略.

例子

例1.x=+1101,y=+0110,xy.
[x]=01101
[y]=11010
[x+y]=100111
xy=+0111
补:书上有特别指出知道 [x][x]【黑人问号???】
这不是很简单啊,如果这个x是负数,哈哈,直接去掉负号就好了,负数变成了正数,正数的补码就是原码不变;OK,正数,那我还不是要做一下负数的补码,为什么要给我再来一种方法,我不要!


2.2.3溢出概念与检测方法

引例1:x=+1011,y=+1001,x+y.
[x]=01011
[y]=01001
[x+y]=10100
正数+正数=负数显然错了!—->正溢。
引例2:x=1101,y=1011,x+y.
[x]=10011
[y]=10101
[x+y]=01000
负数+负数=正数显然错了!—->负溢。

为了判断是否溢出,第一种方法双符号位法:
注意:
①:两个符号位都要加入运算
②:超过两个符号位(2n+2)的数要舍去
IMPORTANT!!!

1.任意正数,两个符号位为”0”
2.任意负数,两个符号位为”1”

MORE IMPORTANT!!!

“01”,表正溢出
“10”,表负溢出

再度使用引例:
引例1:x=+1011,y=+1001,x+y.
[x]=001011
[y]=001001
[x+y]=010100
—->正溢。
引例2:x=1101,y=1011,x+y.
[x]=110011
[y]=110101
[x+y]=101000
—->负溢。

第二种方法:单符号位法。
①:当最高有效位产生进位而符号位无进位时,产生正溢。
②:当最高有效位无进位而符号位有进位时,产生负溢。
逻辑表达式可以用异或门实现。

2.5 定点运算器的组成

计算机最基本的结构:算术/逻辑运算单元、数据缓冲寄存器、通用寄存器、多路转换器和数据总线等逻辑部件。

2.5.1 逻辑运算

逻辑非运算

逻辑非也称求反。
0->1,1->0.

逻辑加运算

逻辑加又称逻辑或。常用记号”+”.
有”1”则”1”。

逻辑乘运算

逻辑乘又称逻辑乘。常用记号”·”.
两个都为1为1.

逻辑异运算

逻辑异又称按位加。常用记号””.
不同为1.

2.5.2 多功能算术/逻辑运算单元(ALU)

串行进位

Cn+1=Y0+X0Cn
Cn+2=Y1+X1Cn+1
Cn+3=Y2+X2Cn+2
Cn+4=Y3+X3Cn+3

并行进位

Cn+1=Y0+X0Cn
Cn+2=Y1+Y0X1+X0X1Cn
Cn+3=Y2+X2Y1+X2Y0X1+X2X0X1Cn
Cn+4=Y3+X3Y2+X3X2Y1+X3X2Y0X1+X3X2X0X1Cn

(算术逻辑运算单元)ALU 组内先行进位
(先行进位发生器) CLA 组件行波进位

2.5.3 内部总线

单总线结构的运算器

1.在同一时间内,只能有一个操作数放在总线上,所以数据可以在任何连个寄存器之间,或者在任一一个寄存器和ALU之间传送。
2.只有在对全部都是CPU寄存器中的两个操作数进行操作时,单总线结构的运算器才会造成一定的损失。例如,在一个输入数是从存储器来的,且运算结果又送回存储器,那么限制数据传送的主要因素时存储器访问时间。

双总线结构的运算器

1.两个操作数同时加到ALU进行运算,只需要一次操作控制。
2.ALU的输出不能直接加到总线上去。因为形成操作结果的输出时,两条总线都被输入数占据,因而必须在ALU输出端设置数据缓冲寄存器。

三总线结构的运算器

1.ALU的输入输出端都有总线相连。
2.操作时间快。

2.5.4 定点运算器的基本结构

2.6 浮点运算和浮点运算器

补一个姿势–十进制分数/小数转二进制:

例:
9/16=0.5625
0.5625重复乘以2,并且每次取个位,则
0.5625*2=1.125 取整数部分1(最高位) 小数部分0.125
0.125*2=0.25 整数部分是0 小数部分0.25
0.25*2=0.5 整数部分是0 小数部分0.5
0.5*2=1 整数部分是1(最低位) 小数部分是0
则0.5625对应的二进制数为0.1001【除不尽考虑有效位数限制】

2.6.1 浮点加法,减法运算

直接举个例题

x=0.510y=0.437510,假设尾数有效位为4位,用二进制形式求(x+y).
解:
首先:先化成二进制,要求化成1.M×10k 形式
x=0.510=1.0002× 21
y=0.437510=1.1102× 22
第一步:小阶对大阶(这里是 y 的阶比 x 的小
y=0.437510=1.1102× 22=0.1112×21
第二步: 尾数相加
x+y=1.0002× 21+(0.1112×21)=0.0012×21
第三步:规格化
x+y=0.0012×21=1.0002× 24
第四步:检查上溢或下溢
1264127 ,求和结果既无上溢也无下溢
第五步:舍入操作
此时尾数有效位正好是4位,舍入时无需做任何改变

2.6.2 浮点乘法,除法运算

想不到的是这个比浮点加法,减法简单。
直接举个例题

设有浮点数 x=0.510y=0.437510,用二进制求(x+y)
首先把十进制化成二进制
x=0.510=1.0002× 21
y=0.437510=1.1102× 22
第一步:将 xy 的指数部分相加:
ex+ey=1+(2)=3
第二步:尾数相乘
1.000×1.110(模拟一下乘法
1110000
得到乘积为1.1100002×23
由于只需要4位有效数,所以最终修正结果:1.1102×23
第三步:规格化与溢出检查
1263127 ,求和结果既无上溢也无下溢
第四步:确定积符号,为负号,得(x+y)=1.1102×23

原创粉丝点击