1.26k likes | 1.38k Views
计算机组成原理. 第 2 章 数据编码和数据运算. 第 2 章 数据编码和数据运算. 学习目标与要求: 掌握二进制数据的编码 掌握编码数据的加减乘除运算方法和运算器的构成。 掌握原码和补码的加减乘除四则运算。 掌握浮点数的四则运算。. 学习内容: 第 1 节 数据与文字的编码 第 2 节 定点数加减运算 第 3 节 定点数乘除运算 第 4 节 逻辑运算 第 5 节 定点运算器的组成和结构 第 6 节 浮点运算和浮点运算器. 2.1 数据与文字的编码. 数据是计算机加工和处理的对象。
E N D
计算机组成原理 第2章 数据编码和数据运算
第2章 数据编码和数据运算 • 学习目标与要求: • 掌握二进制数据的编码 • 掌握编码数据的加减乘除运算方法和运算器的构成。 • 掌握原码和补码的加减乘除四则运算。 • 掌握浮点数的四则运算。 学习内容: • 第1节 数据与文字的编码 • 第2节 定点数加减运算 • 第3节 定点数乘除运算 • 第4节 逻辑运算 • 第5节 定点运算器的组成和结构 • 第6节 浮点运算和浮点运算器
2.1 数据与文字的编码 • 数据是计算机加工和处理的对象。 • 数值 文字 符号 语音 图形 图像 等统称数据,在计算机内部,都必须用数字化编码的形式被存储、加工和传送 。 • “二进制码” • 只使用两个基本点符号:1 0 • 符号个数最少,物理上容易实现 • 与二值逻辑的 真 假 两个值对应简单 • 用二进制码表示数值数据运算规则简单
2.1.1 数制的转换 • 在计算机内用二进制数码表示各种数据,指令和程序的语句都由一串“0”或“1”这样的二进制数码构成的代码组成,这就是机器能惟一识别并执行的机器语言。但是在输入、显示或打印处理结果时,不能用二进制数,因为人们不熟悉,人们习惯于用十进制计数。在编写计算机程序时,往往采用八进制数或十六进制数,以方便阅读和书写。这样就存在着同一个数可用不同的数制表示及它们之间相互转换的问题。
2.1.1 数制的转换 • 进位计数制,简称数制,是人们利用符号来计数的方法。上面我们提到的十进制、二进制、八进制和十六进制都是学习计算机知识应该掌握的数制。 • 数制中的三个基本名词术语: • 数码 用不同的数字符号来表示一种数制的数值,这些数字符号称为“数码”。 • 基 数制所使用的数码个数称为“基”。 • 权 某数制各位所具有的值称为“权”。
2.1.1 数制的转换 十进制数 • 对于十进制(Decimal System)数来说,它有10个数码: 0,1,…, 8,9,因此它的基为10,逢十进一,借一当十。一个十进制数各位的权是以10为底的幂。 这样,一个任意n位十进制数xn-1…x1x0,可以表示为一般式: xn×10n+xn-1×10n-1+…+x1×101+x0×100=∑xi×10i 例如:245=2×102 +4×101 +5×100
2.1.1 数制的转换 各种进位计数制可统一表示为下式: 式中 r——某种进位计数制的基数; i——位序号( 0≤i≤n-1); Ki——第i位上的一个数码为0~r-1中的任一个; Ri——表示第i位上的权; n——最高位的位序号。
十进制转二进制 整数部分除2取余 小数部分乘2取整 1 1 0.625 * 2 2 1 低 0.25 * 2 5 高 1 2 1 0 0 0.5 * 2 2 2 1 1 1 2 高 0.0 低 0 除尽为止求得位数满足要求为止 从二进制数求其十进制的值,逐位码权累加求和
八进制与十六进制 • 八进制(Octave System)数的基为8,即其所使用的数码是 8个: 0,1,…, 6,7,逢八进一,借一当八。一个八进制数各位的权是以8为底的幂。 • 十六进制(Hexadecimal System)数的基为16,所使用的数码共有16个: 0,1,…, 8,9,A,B,C,D,E,F,逢十六进一,借一当十六。这里,数码A表示十进制数的10,B表示十进制数的11,…,F表示十进制数的15。十六进制的权是以16为底的幂。
二进制数与八进制数的转换 • 二进制数转换成八进制数的方法,是将二进制数从小数点开始分别向左(对二进制整数)或向右(对二进制小数)每三位组成一组,每一组有3位二进制数,转换成八进制数码中的1个数字,连接起来即可。不足3位的补0。 • 例:把二进制数(101100011.011100101)2转换为八进制数。 101 100 011. 011 100 101 5 4 3. 3 4 5 即有: (101100011.011100101)2=(543.345)8 • 例:把八进制数(7351.65)8转换为二进制数。 7 3 5 1. 6 5 111 011 101 001. 110 101 即有: (7351.65)8=(111011101001.110101)2
二进制数与十六进制数的转换 • 二进制数与十六进制数的转换方法和二进制数与八进制数的转换方法相类似,即把十六进制数每位的数字与二进制数的4位数相对应就可以了。 • 例:把二进制数(110100110101)2转换为十六进制数。 1101 0011 0101 D 3 5 即有: (110100110101)2=(D35)16 • 例:把十六进制数(E8B)2转换为二进制数。 E 8 B 1110 1000 1011 即有: (E8B)16=(111010001011)2
八进制、十六进制转换成十进制 • 八进制、十六进制转换成十进制可采用按权相加的方法。 • 例:将1258和ad916转换成十进制 1258=1 x 82 + 2 x 81 + 5 x 80 = 8510 ad916=10 x 162 +13 x 161 + 9 x 160 = 277710
2.1.2 定点数的编码 • 在定点表示法中约定:所有数据的小数点位置固定不变。 • 定点整数即纯整数,小数点位置隐含固定在最低有效数位之后X0X1X2…Xn。字长为n+1位的机器,它所能表示的数X其所表示的范围是: 0≤X≤2n+1-1。数据编码位数越多,数据范围越大。 • 定点纯小数(即小数点位于机器数的最左边的数), X0.X1X2…Xn。(X0=0)字长为n+1位的机器所能表示的机器数X的范围是: 0 ≤X≤1-2-n。数据编码位数越多,精度越高。 • 溢出:计算机中数据编码所表示的数值范围是有限的,无法表示时,便产生溢出。
1. 原码表示法 • 原码表示法是一种最简单的机器数表示法,用最高位表示符号位,符号位为“0”表示该数为正,符号位为“1”表示该数为负,数值部分与真值相同。 • 设二进制纯小数的原码形式为Xs.X1X2…Xn,字长n+1位,其中Xs表示符号位。 • 例:X1=0.0110, X2=-0.0110 [X1]原=0.0110, [X2]原=1.0110 • 字长为n+1位的定点整数原码,它所能表示的数所表示的范围是: -(2n-1)≤X≤2n-1
1. 原码表示法 • 设二进制纯整数的原码形式为XsX1X2…Xn,其中Xs表示符号位。 • 例: X1=1101, X2=-1101 [X1]原=01101, [X2]原=11101 • 在原码表示中,真值0有两种不同的表示形式: [+0]原=00000 [-0]原=10000 • 字长为n+1位的定点小数原码,它所能表示的数所表示的范围是:-(1-2-n)≤X≤1-2-n 原码的表示简单,与真值转换方便,但进行减法运算时显得很不方便。
要求 数1 数2实际操作 结果符号 原码的特点: 简单、直观 但是用原码做加法时,会出现如下问题: 加 正 加法 正 正 减 可正可负 加法 正 负 减 可正可负 加法 负 正 加 负 加法 负 负 能否 只做加法 ? 找到一个与负数等价的正数 来代替这个负数 就可使 减 加
2. 补码表示法 • 什么是补码? 我们先从日常生活中的例子来说明。假如现在时间是7点,而你的手表却指着9点,如何调整手表的时间? 有两种方法拨动时针,一种是顺拨,即向前拨动10个小时;另一种是向后拨2个小时。从数学的角度可以表示为: (9+10)-12=19-12=7 或 9-2=7
2. 补码表示法 • 对钟表来说,向前拨10个小时和向后拨2个小时的结果是一样的,减2可以用加10来代替。因为钟表是按12进位的,12就是它的“模”。对模12来说,-2与+10是同余的,也就是说,-2与+10对于模12来说是互为补数的。计算机中的加法器是以2n为模的有模器件,因此可以引入补码,把减法运算转换为加法运算。 • 补码的定义是: 把某数X加上模数K,称为以K为模的X的补码。 [X]补=K+X 因此正数的补码是最高位为符号“0”,数值部分为该数本身;负数的补码是最高位为符号“1”,数值为用模2减去该数的绝对值。
2. 补码表示法 • 正数的补码与其原码相同;负数的补码是先把其原码除符号外的各位求反,然后在最低位加1。 • 自低位向高位,尾数的第一个“1”及其右部的“0”保持不变,左部的各位取反,符号位保持不变。 • 若真值为纯小数,它的补码形式为Xs.X1X2…Xn,其中Xs表示符号位。能表示的数值范围:-1≤X≤1-2-n 例: X1=0.0110, X2=-0.0110 [X1]补=0.0110, [X2]补=1.1010
2. 补码表示法 • 若真值为纯整数,它的补码形式为XsX1X2…Xn,其中Xs表示符号位。能够表示的数据范围是-2n≤X≤2n-1 例: X1=1101, X2=-1101 [X1]补=01101 , [X2]补=10011 • 在补码表示中,真值0的表示形式是惟一的: [+0]补=[-0]补=00000
3.反码表示法 • 反码表示法与补码表示法有许多类似之处,对于正数,数值部分与真值形式相同;对于负数,将真值的数值部分按位取反。 若真值为纯小数,它的反码形式为X0.X1X2…Xn,其中X0表示符号位。字长为n+1位的定点小数反码,它所能表示的数所表示的范围是:-(1-2-n)≤X≤1-2-n 例: X1=0.0110, X2=-0.0110 [X1]反=0.0110 , [X2]反=1.1001
3.反码表示法 • 若真值为纯整数,它的反码形式为X0X1X2…Xn,其中X0表示符号位。字长为n+1位的定点整数反码,它所能表示的数所表示的范围是: -(2n-1)≤X≤2n-1 例: X1=1101, X2=-1101 [X1]反=01101 , [X2]反=10010 在反码表示中,真值0也有两种不同的表示形式: [+0]反=00000 [-0]反=11111
1.比较 对于正数它们都等于真值本身,而对于负数各有不同的表示。 最高位都表示符号位,补码和反码的符号位可作为数值位的一部分看待,和数值位一起参加运算;但原码的符号位不允许和数值位同等看待,必须分开进行处理。 对于真值0,原码和反码各有两种不同的表示形式,而补码只有惟一的一种表示形式。 原码、反码表示的正、负数范围相对零来说是对称的;但补码负数表示范围较正数表示范围宽,能多表示一个最负的数(绝对值最大的负数),其值等于-2n(纯整数)或-1(纯小数)。 三种码制的比较与转换
2.转换 如果已知机器的字长,则机器数的位数应补够相应的位。例如,设机器字长为8位,则: X1=1011 X2=-1011 [X1]原=00001011 [X2]原=10001011 [X1]补=00001011 [X2]补=11110101 [X1]反=00001011 [X2]反=11110100 X3=0.1011 X4=-0.1011 [X3]原=0.1011000 [X4]原=1.1011000 [X3]补=0.1011000 [X4]补=1.0101000 [X3]反=0.1011000 [X4]反=1.0100111
x = +21 大 x = –21 x = +31 x = –31 大 大 10101 + 100000 大 11111 + 100000 4.移码表示法 补码表示很难直接判断其真值大小 如 十进制 二进制 补码 +10101 0,10101 错 –10101 1,01011 +11111 0,11111 错 –11111 1,00001 x + 25 +10101 + 100000 = 110101 正确 = 001011 +11111 + 100000 = 111111 正确 = 000001
[x]移= 2n + x(2n>x≥ 2n) 0 2n 2n+1–1 [x]移码 真值 –2n 0 2n–1 移码定义 x为真值,n为 整数的位数 移码在数轴上的表示 x = 10100 如 [x]移= 25 + 10100 = 1,10100 用 逗号 将符号位 和数值位隔开 x = –10100 [x]移= 25– 10100 = 0,01100
移码和补码的比较 设 x = +1100100 [x]移= 27 + 1100100 = 1,1100100 1 [x]补= 0,1100100 0 设 x = –1100100 [x]移= 27– 1100100 = 0,0011100 0 [x]补= 1,0011100 1 补码与移码只差一个符号位
偏置值为2n的移码的特点 ⑴在移码中,最高位为“0”表示负数,最高位为“1”表示正数。 ⑵移码为全0时,它所对应的真值最小,为全1时,它所对应的真值最大。 ⑶真值0在移码中的表示形式是唯一的,即[+0]移=[-0]移=100…0。 ⑷移码把真值映射到一个正数域,所以可将移码视为无符号数,直接按无符号数规则比较大小。 ⑸同一数值的移码和补码除最高位相反外,其他各位相同。
小数点的位置根据需要而浮动,这就是浮点数。浮点数据通常表示:小数点的位置根据需要而浮动,这就是浮点数。浮点数据通常表示: N=(-1)s×M×RE 其中:S为数据的符号位,R为浮点数的基数(通常r=2)。E和M都是带符号数,E叫做阶码,M叫做尾数。在大多数计算机中,尾数为纯小数,常用原码或补码表示;阶码为纯整数,常用移码或补码表示。 2.1.3 浮点表示法 符号位:代表浮点数的符号 尾数:其位数反映浮点数的精度 阶码:其位数反映浮点数的表示范围
为了提高运算的精度,需要充分地利用尾数的有效数位,通常采取浮点数规格化形式,即规定尾数的最高数位必须是一个有效值。为了提高运算的精度,需要充分地利用尾数的有效数位,通常采取浮点数规格化形式,即规定尾数的最高数位必须是一个有效值。 1/2 ≤|M| < 1 当尾数采用原码表示时,尾数的最高位应当是1. 在尾数用补码表示时,规格化浮点数应满足尾数最高数位与符号位不同(ms⊕m1 =1),即当1/2≤M<1时,应有0.1xx…x形式,当-1≤M<-1/2时,应有1.0xx…x形式。 规格化浮点数
例:将0.0011 x 20和-0.0011 x 20转换成规格化数表示,尾数和符号位采用5位补码编码,阶码采用3位移码。 解: 0.0011 x 20 (1)正数,符号位为0; (2)尾数采用补码形式,0.0011,规格化尾数最高位为1,尾数左移2位, 0. 1100 x 2-2; (3)阶码采用移码,(- 2 )=010。 [0.0011 x 20]浮=0 010 1100 -0.0011 x 20 (1)负数,符号位为1; (2)尾数采用补码形式,1.1101,规格化尾数最高位为0,尾数左移2位, 1. 0100 x 2-2; (3)阶码采用移码,(- 2 )=010。 [-0.0011 x 20]浮=1 010 0100
例设浮点数表示中S=0,E=3,M=0.10002,分别求出当R=2和R=16时它表示的数值。例设浮点数表示中S=0,E=3,M=0.10002,分别求出当R=2和R=16时它表示的数值。 • 解:根据定义N=(-1)s×M×RE 当R=2时,N =(-1)0×0.5×23=4 当R=16时,N =(-1)0×0.5×163=2048
负上溢 正上溢 负数区 正数区 下溢 最小负数 最大正数 最小正数 最大负数 浮点数的表示范围 上溢 阶码 > 最大阶码 下溢 阶码 < 最小阶码 按 机器零(尾数为0)处理 0
IEEE 754标准的浮点数格式 IEEE 754标准
以短浮点数为例讨论浮点代码与其真值之间的关系。最高位为数符位;其后是8位阶码,以2为底,阶码的偏置值为127;其余23位是尾数。为了使尾数部分能表示更多一位的有效值,IEEE754采用隐含尾数最高数位1(即这一位1不表示出来)的方法,因此尾数实际上是24位。应注意的是,隐含的1是一位整数(即位权为20),在浮点格式中表示出来的23位尾数是纯小数,并用原码表示。以短浮点数为例讨论浮点代码与其真值之间的关系。最高位为数符位;其后是8位阶码,以2为底,阶码的偏置值为127;其余23位是尾数。为了使尾数部分能表示更多一位的有效值,IEEE754采用隐含尾数最高数位1(即这一位1不表示出来)的方法,因此尾数实际上是24位。应注意的是,隐含的1是一位整数(即位权为20),在浮点格式中表示出来的23位尾数是纯小数,并用原码表示。
例:将(100.25)10转换成短浮点数格式。 ⑴ 十进制数→二进制数 (100.25)10=(1100100.01)2 ⑵ 非规格化数→规格化数 1100100.01=1.10010001×26 ⑶ 计算移码表示的阶码(偏置值+阶码真值) 1111111+110=10000101 ⑷ 以短浮点数格式存储该数。 符号位=0 阶码=10000101 尾数=10010001000000000000000 短浮点数代码为 0;10000101;10010001000000000000000 表示为十六进制的代码:42C88000H。
阶码 符号位 尾数 例:把短浮点数C1C90000H转换成为十进制数。 ⑴ 十六进制→二进制形式,并分离出符号位、阶码和尾数。 C1C90000H= 1;10000011;10010010000000000000000 ⑵ 计算出阶码真值(移码-偏置值) 10000011-1111111=100 ⑶ 以规格化二进制数形式写出此数 1.1001001×24 ⑷ 写成非规格化二进制数形式 11001.001 ⑸ 转换成十进制数,并加上符号位。 (11001.001)2=(25.125)10 所以,该浮点数=-25.125
2.1.4 文字的编码 • 1.西文字符的编码 • ASCII字符编码 常见的ASCII码用七位二进制表示一个字符,它包括10个十进制数字(0~9)、52个英文大写和小写字母(A~Z,a~z)、34个专用符号和32个控制符号,共计128个字符。 在计算机中,通常用一个字节来存放一个字符。 在ASCII码表中,数字和英文字母都是按顺序排列的,只要知道其中一个的二进制代码,不要查表就可以推导出其他数字或字母的二进制代码。
2.1.4 文字的编码 • 2.汉字的编码 软件定义和处理。 • 3.十进制数的编码 • (1)字符串形式 字符串是指一串连续的字符。例如,字符串IF X>0 THEN READ (C)。 向量存放法在存储器中占用一片连续的空间,每个字节存放一个字符代码,字符串的所有元素(字符)在物理上是邻接的。在字长为32位的存储器,每一个主存单元可存放4个字符,整个字符串需5个主存单元。在每个字节中实际存放的是相应字符的ASCII码。
I F X 20 58 49 46 > T 20 54 0 3E 30 20 E N H 4E 48 45 41 44 R E 45 A D 52 ( ) 20 C 28 43 29 字符串的向量存放法
3.十进制数的编码 • (2)压缩的十进制数串 压缩的十进制数串,一个字节可存放两位BCD码表示的十进制数,既节省了存储空间,又便于直接进行十进制算术运算。 在主存中,一个压缩的十进制数串占用连续的多个字节,每位数字仅占半个字节。符号位也占半个字节,并存放在最低数值位之后,通常用CH表示正号,DH表示负号。在这种表示中,规定数字的个数加符号位之和必须为偶数;当和为奇数时,应在最高数值位之前补0H(即第一个字节的高半字节为“0000”)。
2.1.5 检错码和纠错码 • 1.奇偶校验码 奇偶校验码是一种最简单的数据校验码,它的码距等于2,可以检测出一位错误(或奇数位错误),但不能确定出错的位置,也不能检测出偶数位错误。 奇偶校验实现方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。 校验位的取值(0或1)将使整个校验码中“1”的个数为奇数或偶数,所以有两种可供选择的校验规律: 奇校验──整个校验码(有效信息位和校验位)中“1”的个数为奇数。 偶校验──整个校验码中“1”的个数为偶数
例 设信息码为10010011,求该代码的奇校验编码和偶校验编码。 • 解:10010011中1的个数为4,偶数。 奇校验码应该为1 偶校验码应该为0 将校验码放在信息码的右边,得到的: 奇校验编码为100100111 偶校验编码为100100110
2.海明码 • 汉明码的实现原理是,在数据中加入几个检验位,将数据代码的码距比较均匀地拉大,并把数据的每一个二进制位分配在几个奇偶校验组中。当某一位出错时,就会引起相关的几个校验位的值发生变化,这不仅可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。
2.海明码 • (7,4)海明码:4位信息码,3位校验码。 • 设信息位为x1,x2 ,x3 ,x4,校验码3位为c1,c2 ,c3 c1= x1+x2 +x3 mod2 c2= x2+x3 +x4 mod2 c3= x1+x2 +x4 mod2 • 7位构成了一个码字w。w = { x1,x2 ,x3 ,x4 ,c1,c2 ,c3 } = {w1,w2 ,w3 ,w4 ,w5,w6 ,w6 } • 校验的方法: s1= x1+x2 +x3+ c1 =w1+w2 +w3+ w5 mod2 s2= x2+x3 +x4 + c2 =w2+w3 +w4 + w6 mod2 s3= x1+x2 +x4 + c3 =w1+w2 +w4 + w3 mod2 s1s2s3全零,则无错; s1s2s3不全零,则查表。
循环码 • 循环冗余校验码是通过除法运算来建立有效信息位和校验位之间的约定关系的。假设,待编码的有效信息以多项式M(X)表示,将它左移若干位后,用另一个约定的多项式G(X)去除,所产生的余数R(X)就是检验位。有效信息和检验位相拼接就构成了CRC码。当整个CRC码被接收后,仍用约定的多项式G(X)去除,若余数为0表明该代码是正确的;若余数不为0表明某一位出错,再进一步由余数值确定出错的位置,以便进行纠正。
1.循环冗余校验码的编码方法 循环冗余校验码是由两部分组成的,左边为信息位,右边为校验位。若信息位为N位,校验位为K位,则该校验码被称为(N+K,N)码。 循环冗余校验码的格式
1.循环冗余校验码的编码方法(续) 循环冗余校验码编码规律 ⑴把待编码的N位有效信息表示为多项式M(X)。 ⑵把M(X)左移K位,得到M(X)×XK,这样空出了K位,以便拼装K位余数(即校验位)。 ⑶选取一个K+1位的产生多项式G(X),对M(X)×XK作模2除。 =Q(X)+ ⑷把左移K位以后的有效信息与余数R(X)作模2加减,拼接为CRC码,此时的CRC码共有N+K位。