2.1 数据与文字的表示方法
2.1.1 数据样式
在选择计算机的表示方法时,要考虑
1. 数的类型(小数,整数,实数和复数)
2. 数值范围
3. 数值精确度
4. 数据存储和处理所需的硬件代价
计算机中常用的数据表示格式:1. 定点格式;2. 浮点格式
定点格式:数据范围有限,要求的处理硬件比较简单
浮点格式:数据范围较大,要求的处理硬件比较复杂
1.定点数的表示方法:
参与运算的数的小数点位置固定不变。
Xn | Xn−1 ... X1 X0 |
---|---|
符号 | 量值(尾数) |
纯小数:
小数点在Xn和Xn−1之间。
小数点固定在最高位之后称为定点小数。若机器字长为n+1位,数值表示为:
X=Xn.Xn−1 ... X1 X0,其中Xi=0,1,0≤i≤n(这里Xn不表示数字,只表示符号,若Xn=0,则代表X=0. Xn−1 ... X1 X0,Xn=1,则代表−0. Xn−1 ... X1 X0。
例如:1111表示-0.875
绝对值最小:各位均为0,|X|min=0;
绝对值最大:各位均为1,|X|max=1−2−n;
纯整数:
小数点在X0右边。
绝对值最小:各位均为0,|X|min=0;
绝对值最大:各位均为1,|X|max=2n−1;
PS:
0.1111111 = 1.0000000 - 0.0000001 = 1 - 2−7;
0 1111111 = 1 0000000 - 1 = 27 - 1;
2.浮点数的表示方法:
- 任意十进制N 可以写成
N=10E.M - 任意二进制N 可以写成
N=2e.M
-M 为浮点数的尾数,是一个纯小数
-e 是比例因子的指数,称为浮点数的指数,是一个整数
IEEE754标准
S | M | |
---|---|---|
31(1) | 30———23(8) | 22———0(23) |
-
-E 是阶码,占用8位;阶码采用移码方法来表示正负指数。
指数真值变成阶码
当尾数的值不为0时,尾数域的最高位应为1,这称为浮点数的规格化表示。否则以修改阶码的同时左右移动小数点位置的方法,使其变成规格化数形式。
32位浮点数x的真值表示:
x=(−1)S×(1.M)×2 E−127;
e+127=E.
其中尾数域所表示的值是1.M。由于规格化的浮点数的尾数域最左位(最高有效位)总是1,故这一位经常不予存储,而认为隐藏在小数点的左边。于是23位字段可以存储有效数。
例1:(754标准转化10进制)
若浮点数x的754标准存储格式为(41360000)16 ,求其浮点数的十进制数值。
将16进制转化成二进制:
S 符号位 | M 尾数 | |
---|---|---|
0 | 100 0001 0 | 011 0110 0000 0000 0000 0000 |
31(1) | 30———23(8) | 22———0(23) |
指数 e = 阶码 - 127=10000010 - 00000011 =
包括隐藏位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 符号位 | 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. 原码表示法
若定点整数的原码形式为 例:x=−1001, 则原码[x]原=11001<=24−(−x) 简单: 设一个二进制整数补码有n+1 位(含1位符号位 xn),即: [x]补=xn.xn−1 ... x1 x0 1.当x 为正整数的时候, 2.当x 为负整数的时候, 3.当x 为0的时候 则其补码表示的真值为[推荐补码记个公式] x=−2nxn+∑n−1i=02ixi 例一: 已知[x]补=01001,求x= 例二: 已知[x]补=11001,求x= 1.一个正整数,都一样 So, 正数的原、反、补码都一样:0的原码跟反码都有两个,因为这里0被分为+0和-0。 移码通常用于表示浮点数的阶码。 [e]移 = 2k + e 举例: 阶码数值部分是5,以 e 表示真值,则 当正数 e=+10101,时,[e]移=1,10101; 搞到这里真的要亲切愉快地说一下,原码,反码,补码,移码的基本姿势,讲完惹!!! IEEE754标准: 1.最大正数:M大,E大,符号位0 字符信息用数据表示,称为符号数据。 汉字的输入编码 数据位中1的个数有偶数个,偶校验C为0;奇数个,奇校验C为0。 公式: [x]补+[y]补=[x+y]补 例子 例1.x=+1011,y=−0101,求x+y 公式: [x]补−[y]补=[x−y]补=[x]补+[−y]补 例子 例1.x=+1101,y=+0110,求x−y. 引例1:x=+1011,y=+1001,求x+y. 为了判断是否溢出,第一种方法双符号位法: 1.任意正数,两个符号位为”0” MORE IMPORTANT!!! “01”,表正溢出 再度使用引例: 第二种方法:单符号位法。 计算机最基本的结构:算术/逻辑运算单元、数据缓冲寄存器、通用寄存器、多路转换器和数据总线等逻辑部件。 逻辑非也称求反。 逻辑加又称逻辑或。常用记号”+”. 逻辑乘又称逻辑乘。常用记号”·”. 逻辑异又称按位加。常用记号”⊕”. 串行进位 Cn+1=Y0+X0Cn 并行进位 Cn+1=Y0+X0Cn (算术逻辑运算单元)ALU 组内先行进位 1.在同一时间内,只能有一个操作数放在总线上,所以数据可以在任何连个寄存器之间,或者在任一一个寄存器和ALU之间传送。 1.两个操作数同时加到ALU进行运算,只需要一次操作控制。 1.ALU的输入输出端都有总线相连。 补一个姿势–十进制分数/小数转二进制: 例: 直接举个例题 设x=0.510,y=−0.437510,假设尾数有效位为4位,用二进制形式求(x+y)浮. 想不到的是这个比浮点加法,减法简单。 设有浮点数 x=0.510,y=−0.437510,用二进制求(x+y)浮。
[x]原={x,2n−x=2n+|x|,2n>x≥0 0≥x>−2n
[x]原 是机器数,x 是真值。
其实就是正数&&0的真值保持不变,真值为负数的原码在最左边(
2.反码表示法
正数的反码就是原码.
负数的反码就是原码的符号位不变,然后其余位上全部取反(0->1/1->0).3. 补码表示法
补码和真值的关系:
x=0×24+1×23+0×22+0×21+1×20=9
x=−1×24+1×23+0×22+0×21+1×20=−7原码转补码:
2.一个负整数,1)原码符号位不变,整数的每一位二进制求反得到反码。2)反码符号位不变,反码最低位+1,得到补码。
4. 移码表示法
由于阶码是个k的整数,假定定点整数移码形式为 ekek−1⋅⋅⋅e2e1e0(最高位为符号位)时,移码的传统定义为
[e]移为机器数,e为真值,2k是一个固定的偏移值常数
So:
当负数 e=−10101,时,[e]移= 25 + e=25 − 1,10101=0,01011;
现在来讨论一下,对于机器字长为 n 位,定点表示,尾数
1.原码:
很简单啊,
最大值,正数的话全是1(除了符号位):0...11111=2n−1
最小值,还是全是1然后添个负号呗:1...11111=−(2n−1)
2.反码:
正数的原码和反码一样:0...11111=2n−1
负数还是类似与原码:1...00000=−(2n−1)
3.补码:
还记得补码和真值的关系嘛?
就是符号位是减(−2n),其余位都是加(+2k)
那么显然的:
正数的话,符号位不要减,其他都加了:0...11111=2n−1
负数的话,符号位要减,其他都不要加:1...00000=−2n【哇,好神奇啊】
32位浮点数x的真值表示:
x=(−1)S×(1.M)×2 E−127;
e+127=E.
例【9】:
假设由S,E,M三个域组成的一个32位二进制数所表示的非零规格化浮点数x,真值表示为(注意此例不是IEEE格式 见上)
x=(−1)S×(1.M)×2 E−128;S 符号位
M 尾数
0
00 000 000
000 0000 0000 0000 0000 0000
0
11 111 111
111 1111 1111 1111 1111 1111
同理,最小正数,最大负数,最小负数。
2.1.3 字符与字符串的表示方法
国际版为IRA码,美国版称为ASCII码。
打印机设备可以打印95个字符;另外33个字符被用作操作码,控制计算机某些外围设备的工作特性和某些计算机软件的运行情况。2.1.4 汉字的表示方法
常用的国际区位码。实际上把汉字表示成一个二维数组。区码和位码各两位十进制数字。
以汉语拼音为基础的输入方法。
字形编码是汉字的形状来进行的编码。2.1.4 校验码
数据 偶校验编码C 奇校验编码C 10101010 10101010 0 10101010 1 01010100 01010100 1 01010100 0 11111111 11111111 0 11111111 1 2.2 定点加法,减法运算
2.2.1补码加法
[x]指机器码
证明略.
[x]补=0,1011
[y]补=1,1011
[x+y]补=10,0110
x+y=+0110
注意:①:符号位要作为数参与运算;②:超过符号位 2n+1 的位要丢掉2.2.2补码减法
[x]指机器码
证明略.
[x]补=0,1101
[−y]补=1,1010
[x+y]补=10,0111
x−y=+0111
补:书上有特别指出知道 [x]补 求 [−x]补【黑人问号???】
这不是很简单啊,如果这个x是负数,哈哈,直接去掉负号就好了,负数变成了正数,正数的补码就是原码不变;OK,正数,那我还不是要做一下负数的补码,为什么要给我再来一种方法,我不要!
2.2.3溢出概念与检测方法
[x]补=0,1011
[y]补=0,1001
[x+y]补=1,0100
正数+正数=负数显然错了!—->正溢。
引例2:x=−1101,y=−1011,求x+y.
[x]补=1,0011
[y]补=1,0101
[x+y]补=0,1000
负数+负数=正数显然错了!—->负溢。
注意:
①:两个符号位都要加入运算
②:超过两个符号位(2n+2)的数要舍去
IMPORTANT!!!
2.任意负数,两个符号位为”1”
“10”,表负溢出
引例1:x=+1011,y=+1001,求x+y.
[x]补=00,1011
[y]补=00,1001
[x+y]补=01,0100
—->正溢。
引例2:x=−1101,y=−1011,求x+y.
[x]补=11,0011
[y]补=11,0101
[x+y]补=10,1000
—->负溢。
①:当最高有效位产生进位而符号位无进位时,产生正溢。
②:当最高有效位无进位而符号位有进位时,产生负溢。
逻辑表达式可以用异或门实现。2.5 定点运算器的组成
2.5.1 逻辑运算
逻辑非运算
0->1,1->0.逻辑加运算
有”1”则”1”。逻辑乘运算
两个都为1为1.逻辑异运算
不同为1.2.5.2 多功能算术/逻辑运算单元(ALU)
Cn+2=Y1+X1Cn+1
Cn+3=Y2+X2Cn+2
Cn+4=Y3+X3Cn+3
Cn+2=Y1+Y0X1+X0X1Cn
Cn+3=Y2+X2Y1+X2Y0X1+X2X0X1Cn
Cn+4=Y3+X3Y2+X3X2Y1+X3X2Y0X1+X3X2X0X1Cn
(先行进位发生器) CLA 组件行波进位2.5.3 内部总线
单总线结构的运算器
2.只有在对全部都是CPU寄存器中的两个操作数进行操作时,单总线结构的运算器才会造成一定的损失。例如,在一个输入数是从存储器来的,且运算结果又送回存储器,那么限制数据传送的主要因素时存储器访问时间。双总线结构的运算器
2.ALU的输出不能直接加到总线上去。因为形成操作结果的输出时,两条总线都被输入数占据,因而必须在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 浮点加法,减法运算
解:
首先:先化成二进制,要求化成1.M×10k 形式
x=0.510=1.0002× 2−1
y=−0.437510=−1.1102× 2−2
第一步:小阶对大阶(这里是 y 的阶比
y=−0.437510=−1.1102× 2−2=−0.1112×2−1
第二步: 尾数相加
x+y=1.0002× 2−1+(−0.1112×2−1)=0.0012×2−1
第三步:规格化
x+y=0.0012×2−1=1.0002× 2−4
第四步:检查上溢或下溢
−126≤−4≤127 ,求和结果既无上溢也无下溢
第五步:舍入操作
此时尾数有效位正好是4位,舍入时无需做任何改变2.6.2 浮点乘法,除法运算
直接举个例题
首先把十进制化成二进制
x=0.510=1.0002× 2−1
y=−0.437510=−1.1102× 2−2
第一步:将 x 和
ex+ey=−1+(−2)=−3
第二步:尾数相乘
1.000×1.110(模拟一下乘法
得1110000
得到乘积为1.1100002×2−3
由于只需要4位有效数,所以最终修正结果:1.1102×2−3
第三步:规格化与溢出检查
−126≤−3≤127 ,求和结果既无上溢也无下溢
第四步:确定积符号,为负号,得(x+y)浮=−1.1102×2−3