计算机组成原理(二) 计算机算术

位与字节

1,计算机中存储和处理信息的最小单位是位(比特bit),一个比特的值可以是0或者1
2,数字计算机将信息以一组或一串比特的形式保存在存储器中。如,串01011110表示一个8位的字
3,计算机通过高低电压(高低电位)两个电压等级来存储0和1的状态
4,计算机通常不会每次只对一个二进制位进行操作,而是对一组二进制位进行操作。
5,8个二进制位为一个字节(byte),一些计算机制造商用术语“字”表示16位的值,长字表示32位的值,还有一些制造商用字表示32位的值,用半字表示16位的值

信息表示:一个由二进制1和0组成的串没有任何内在含义。需要程序员赋予它何种含义、

ASCII码表(美国信息交换标准码表)

1,ASCII码表用7位表示一个字符,一共可以表示2^7=128个不同的字符。其中96个特殊字符是可打印字符。其中32个是不可打印字符,用于完成回车、退格、换行等特殊功能
2扩展的ASCII码表:8位的ISO 8859-1拉丁编码。将7位的ISO/ASCII字符集扩展为8位,可以得到两个128个字符的字符集,如果字符的最高位为0,则其余7位代表128个标准ISO/ASCII字符中的一个,如果字符最高位为1,其余7位将表示128个新字符中的任意一个

图像、声音和视觉

数字计算机处理大量表示声音、静态图像和视频的数据。
组成照片的基本单位是像素,每个像素的大小可以使8位(单色)或24位(RGB)
视频作为一串静态图像一次传输,每秒发送60次。
声音通过对波形信号采样。
无损压缩和有损压缩。

数字

1,用来计数的数字(即1,2,3,4,5…)被称为自然数。我们用十进制计数,因为它有0~9共10个符号。并非所有数字都是自然数,还有负数、实数等
2,现代数字系统中,使用位置记数法表示十进制数,每个数位的值或权取决于它在数字中的位置

位置记数法

采用位置记数法,一个数的数值等于它各位值的总和,而每一位的值则是改为的数值乘以它在数中的位置所对应的权
如:十进制1982 = 1103+9*102+8101+2*100
二进制数1.01 = 120+0*2-1+12^-2
注意:十进制位置记数法不能精确表示所有小数,如1/3是0.33333333……3,二进制也是如次

二进制运算

二进制算术运算规则与十进制基本相同,区别是基数不同。

有符号整数

负数可以用多种不同的方式表示,计算机设计者选择了3种方法:符号及值表示法、二进制补码表示法、移码表示法,每种方法都有各自的优缺点。

符号及值表示法

1,一个n位字可以表示从0~2^n-1 共2^n个可能的值。如,一个8位的字可以表示0,1,2,……,254,255
2,表示负数的方法是用它的最高位表示符号,通常符号位为0表示正数,符号位为1表示负数
3,n位有符号的表示范围为-(2^n-1 -1)~+2^n-1 -1),例如,一个8位有符号数的表示-127(11111111)~+127(01111111)之间的整数。
4,有人反对该系统的一个原因是它有两个值都表示0:
00000000 = +0和10000000 = -0
5,符号及值表示法没有被用于整数算术运算中,因为它的加、减法运行需要分为用加法器和减法器实现。符号及值表示法用于浮点算术运算中。

补码运算

(1),微处理器用二进制补码系统表示有符号整数,它可以将减法运算转换为对减数的补码的加法运算。(将减法转为加法 )
(2),一个数与它的补码之和是一个常数。如一个一位十进制与它的补码之和总是9,2的补码 是 7,因为2+7 =9.在n位二进制算术中,数P的补码为Q且P+Q=2^n。
在二进制算术中,求一个数的补码的方法是将其各位取反并加1.
(3)一个n位二进制数N的二进制补码定义为2^n - N。如果N=5=00000101(8位二进制数),则N的补码为2^8-00000101 = 10000000-00000101 = 11111011

将-7加5
00000101+11111001 = 11111110
5+(-7) = -2;
结果为11111110(进位位为0)。也是希望得到的结果-2,即2^8-2 = 11111110
n位二进制算术运算Z=X-Y,如果X加上Y的补码完成运算:Y的补码为2^n - Y,则Z = X+(2^n - Y) = 2^n + (X-Y)。我们得到了需要的结果,X-Y,以及位于最左边的一个并不需要的进位(即2^n),而这个进位被丢弃了。

补码为什么是取反加1
一个n位的二进制数N的补码,被定义为2^n - N,则
2^n -1 - N + 1 = 111……1 - N+ 1

补码的特点

(1) 补码是一个真正的互补系统,因为+X+(-X) =0
(2) 补码0被表示为00……0,是唯一的
(3) 补码的最高位为符号位。如果符号位为0,则该数位正,符号位为1,则该数为负
(4) n位二进制补码数的表示范围为-2(n-1)~2(n-1)-1,对于n =8,补码范围为-128~127
(5) 补码加法和减法使用同样的硬件完成,因为补码减法由被减数的补码实现

运算溢出

5位有符号二进制补码范围为-16~15,如果两个负数相加且结果小于-16,会超出5位二进制补码的范围,如果操作数A和B的符号位相同,但结果的符号位与他们不同,则发生溢出

移位运算

进行移位运算时,一个数所有位都会向左向右移动一位,如将00101100左移一位,变成01011000,右移一位,变成00010110。有些计算机每次可以移动多位
二进制补码正数左移一位等价于该数乘以2.
算术左移:最低位补0,最高位被复制到进位标志中,如11000101左移一位得到10001010
算术右移:最高位补符号位,所有位右移一位。最低位复制到进位标志中。如00100101右移一位得到00010010

无符号二进制乘法

方法一:
(1)将计数器的值置为n
(2)将2n位的部分积寄存器清零
(3)检查乘数的最右位(即最低位),将被乘数与部分积的最低位n位相加
(4)将部分积右移一位
(5) 将乘数右移一位(乘数的最右位被丢弃)
(6)将计数器的值减1,重复步骤c直到n个周期后计数器的值变为0.部分积寄存器的内容就是乘积结果
方法二:快速乘法
使用移位和加法等速度相对较快的操作避免使用乘法。
例如: 10P = 2(22P+P),即将P左移2次,加上P,再将和左移一次

除法

除法是通过被除数不断地减去除数直到结果为0或小于除数来实现的。减去除数的次数叫做商,最后一次减法的差称为余数。
被除数/除数 = 商+ 余数/除数

浮点数

(1) 浮点数即实数,实数是所有有理数和无理数的集合
(2) 之所以叫做浮点数,是因为小数点在数中的位置并不是固定的。一个浮点数值分为两部分存储:数值以及小数点在数值中的位置
(3) 计算机中的浮点运算结果一般是不确定的,一块芯片上的浮点计算结果也许与另外一块芯片上的不同
(4) 科学记数法:来表示很大或很小的数
(5) 十进制浮点数可以表示为:尾数10指数,如1.23*1020
(6) 二进制浮点数可以被表示为:尾数
2指数,如1.011*25
(7) IEEE 754浮点数标准提供3种浮点数表示:32位单精度浮点数、64位双精度浮点数、128位四精度浮点数

规格化浮点数

(1)IEEE 754浮点数的尾数总是规格化的,其范围为1.000…02e到1.111…1*2e,e为指数
(2)规格化浮点数的最高位总是1,规格化使尾数的所有位都是有效的,因而尾数精度最高。
如:0.10
2^e 规格化为 1.0*2^(e-1)
(3)尾数规格化充分利用了可用的最大精度。如,一个8位非规格化的尾数0.00000101只能有4位有效位,而规格化后的8位尾数1.0100011则有8位有效位。

偏置指数

(1) IEEE 754浮点数的尾数被表示为符号及值的形式,即用一个符号位表示它是正数还是负数。它的指数则用偏置方式表示,即给咱真正的指数加上一个常数。
(2) 假定所用的指数为8位,偏置值位127。如果一个数的指数为0,则被保存为0+127 = 127。如果指数为-2,则被保存为-2+127 = 125.
(3) 实数1010.1111规格化的结果为+1.0101112^3,指数为+3,将被保存为3+127 = 130,即130(10)用二进制表示为10000010
(4) 这种用偏置表示指数的方法优点在于,最小的负指数被表示为0,如果不采用这种方法,0的浮点表示为0.00000
2^最小负指数。采用偏置指数,0就可以用尾数0和指数0表示
(5) 余码系统:在余码系统中,正的和负的整数都可以作为无符号数存储。为了表示正的或负的整数,一个正整数(称为偏移量)加到每个数字中,将它们统一移到非负的一边。这个偏移量的值是2^(m-1)-1,m是内存单元存储指数的大小
(6) 优点在于在余码系统中的所有整数都是正数,当我们对这些整数进行比较或运算时不需要考虑符号

IEEE(电气和电子工程师协会)浮点数

1,一个32位IEEE 754单精度浮点数可以表示为下面的二进制串
S EEEEEEEE 1.MMMMMMMMMMMMMMMMMMMMMM(22个M)
(1)S为符号位,指明这个数是正数还是负数(0为正数,1为负数)
(2)E为8位偏置指数,指出了小数点的位置
(3)M为23位尾数
2,IEEE浮点数的尾数总是规格化的,其值范围在1.00000……0~1.11111……1,除非这个浮点数是0,此时尾数为0.000……0。
3,由于尾数总是规格化的,且最高位总是为1,因此将尾数存入存储器时没有必要保存最高位的1.所以,一个非0的IEEE 754浮点数可定义为:

                   X = (-1)^S  *  2^(E-B) * 1.F
                          S:符号位  
                             E:偏置量为B的指数
                         F:尾数的小数部分(实际的尾数为1.F,有个隐含的1)

4,浮点数0被表示为S=0,E=0,M=0(即浮点数0用全0表示)

IEEE浮点数格式

1,ANSI/IEEE 745-1985标准定义了基本的和扩展的浮点数格式,以及一组数量有限的算术运算的规则(加、减、乘、除、平方根、求余和比较)
2,非数(Not a Number,NaN)是IEEE 754标准提供的一个专门符号,代表IEEE 754标准格式所不能表示的数。
3,单精度,指数位为8位,尾数位为23位,总共32位
双精度,指数位为11位,尾数位为52位,总共64位
四精度,指数位为15位,尾数位为111位,总共128位
符号位都是1位,开始位也是1位(但是不保存,都是1)
4,在32位IEEE754单精度浮点数格式中,最大指数E(max) 为+127,最小指数E(min)为-126,而不是+128~-127。E(min)-1(即-127)用来表示浮点0,Emax+1用来表示正/负无穷大或NaN数。
5,下图,描述了IEEE单精度浮点数格式,指数E=0和E=255等特例分别被用于表示浮点0、非规格化小数、正或负无穷大、以及NaN

IEEE浮点数的特点

(1) 浮点数接近0时的特点,浮点数0到下一个规格化的正数和浮点数0到上一个规格化的负数附近有一块禁止区,其中的浮点数都是非规格化的,因此无法被表示为IEEE标准格式。这个数的指数和起始位都是0的区域,也可用来表示浮点数。但是这些数都是非规格化,其精度比规格化的数的精度低,会导致渐进式下溢。
(2) IEEE标准规定,缺省的舍入技术应该向最近的值舍入
(3) IEEE标准规定了4种比较结果,分别是等于、小于、大于和无序(unordered),无序用于一个操作数是NaN数的背景
(4) IEEE标准规定了5种异常
(a)操作数不合法:当程序员使用一些不合法的操作数。如NaN数、与无穷大数相加相减时、求负数的平方根
(b)除数为0
© 上溢:当结果比最大浮点数还大时。处理上溢的方法有终止计算和饱和运算(用最大值作为结果)
(d)下溢:当结果比最小浮点数还小时。也就是说,结果小于2Emin。下溢可以通过将最小浮点数设为0或用一个小于2Emin的非规格化数表示最小浮点数等方式处理
(e) 结果不准确:当某个操作产生舍入错误时

浮点运算

浮点数不能直接相加。
两个浮点数相乘,应将尾数相乘,指数相加
浮点数相加是,应将小数点对齐
为了对齐指数,计算机必须执行下面步骤
(1) 找出指数较小的数
(2) 使两个数的指数相同
(3) 尾数相加减
(4) 如果有必要,将结果规格化
注意:
(1)如果两个指数的差大于P+1,P为尾数的位数,较小的数由于太小而无法影响较大的数,结果实际就等于较大的数
(2)结果规格化时检查指数范围,以分别检测指数下溢或上溢。煮熟下溢会导致结果为0,而指数上溢会造成错误。

舍入和截断误差

截断:,浮点运算可能引起尾数位数的相加,需要保持尾数位数不变的方法。最简单的技术叫作截断。
如:将0.1101101截断为4位尾数的结果为0.1101.截断会产生诱导误差(即误差是由施加在数上的操作计算所引起的),诱导误差是偏置的,因为截断后的数总比截断前小
舍入:舍入是一种更好的减少数的位数的技术。如果丢弃的位的值大于剩余数最低位的一半,将剩余数的最低位加1.
例如:0.1101101 = 0.1101+1 = 0.1110
0.1101011=0.1101

舍入机制:

(1) 最简单的舍入机制是截断或向0舍入
(2) “向最近的数舍入”方法会选择距离该数最近的那个浮点数作为结果。
(3) “向正或负无穷大舍入”方法会选择正或负无穷大方向上最近的有效浮点数作为结果。
(4) 当要舍入的数位于两个连续浮点数的正中时,IEEE舍入机制选择最低位为0的点(即向偶数舍入)

浮点运算和程序员

(1) 整数操作时精确、可重复的,浮点数操作是不精确的。
(2) 考虑表达式z=(x2)-(y2),x,y,z都是实数。可以将表达式视作(x+y)*(x-y)计算,整数运算可以得到相同结果,但浮点数运算可能得到不同结果。
(3) IEEE要求加、减、乘和除运算结果能够精确计算,并用向偶数舍入的方法将结果舍入为最近的浮点数

Guess you like

Origin blog.csdn.net/weixin_44806700/article/details/120190350