第2章数据的机器层次表示数值数据的表示2.1机器数的定点表示与浮点表示2.2非数值数据表示2.3十进制数和数串的表示2.4现代微型计算机系统中的数据表示举例2.5数据校验码2.62.1数值数据的表示2.1.1计算机中的数值数据2.1.2无符号数和带符号数2.1.3原码表示法2.1.4补码表示法2.1.5反码表示法2.1.6三种机器数的比较与转换2.1.1计算机中的数值数据人们在日常生活中最常使用的是十进制数,这恐怕和人有十个指头是分不开的。然而,在计算机中数据通常用二进制数来表示,任何数值数据都可以由一串“0”或“1”的数字表示。考虑到二进制数位数比较长,书写起来不方便,在计算机中也使用八进制和十六进制来表示数值数据。为了避免出现误会,在给出一个数的同时就必须指明这个数的数制,例如:(1010)2、(1010)8、(1010)10、(1010)16所代表的数值就不同。除了用下标来表示不同的数制以外,在计算机中还常用后缀字母来表示不同的数制。后缀B表示这个数是二进制数(Binary);后缀Q表示这个数是八进制数(Octal),本来八进制数的英文单词的第一个字母应当是O,因为O与数字0太容易混淆,所以常使用字符Q作为八进制数的后缀;后缀H表示这个数是十六进制数(Hexadecimal);而后缀D表示这个数是十进制数(Decimal)。十进制数在书写时后缀D可以省略,其他进制在书写时后缀一般不可省略。例如:有4个数分别为375D、101B、76Q、A17H,从后缀字母就可以知到他们分别是十进制数、二进制数、八进制数和十六进制数。计算机系统设计师和程序员更钟情于采用程序设计语言的记号来表示不同进制的数,这就是前缀表示法,例如:在C语言中,八进制常数以前缀0开始,十六进制常数以前缀0x开始。2.1.2无符号数和带符号数所谓无符号数,就是整个机器字长的全部二进制位均表示数值位(没有符号位),相当于数的绝对值。例如:N1=01001表示无符号数9。N2=11001表示无符号数25。机器字长为n+1位的无符号数的表示范围是0~(2n+1-1),此时二进制的最高位也是数值位,其权值等于2n。若字长为8位,则数的表示范围为0~255。一般计算机中都设置有一些无符号数的运算和处理指令。如Intel8086中的MUL和DIV指令就是无符号数的乘法和除法指令,还有一些条件转移指令也是专门针对无符号数的。然而,大量用到的数据还是带符号数,即正、负数。在日常生活中用“+”、“-”号加绝对值来表示数值的大小,用这种形式表示的数值在计算机技术中称为“真值”。对于数的符号“+”和“-”,计算机是无法识别的,因此需要把符号数码化。通常,约定二进制数的最高位为符号位,“0”表示正号,“1”表示负号。这种在计算机中使用的表示数的形式称为机器数,常见的机器数有原码、反码、补码等不同的表示形式。带符号数的最高位被用来表示符号位,而不再表示数值位。前例中的N1、N2在这里的含义变为:N1=01001表示+9。N2=11001根据机器数的不同形式表示不同的值,如是原码则表示-9,补码则表示-7,反码则表示-6。为了能正确地区别出真值和各种机器数,本书用X表示真值,[X]原表示原码,[X]补表示补码,[X]反表示反码。2.1.3原码表示法原码表示法是一种最简单的机器数表示法,其最高位为符号位,符号位为“0”时表示该数为正,符号位为“1”时表示该数为负,数值部分与真值相同。若真值为纯小数,它的原码形式为XS。X1X2…XN,其中XS表示符号位。原码的定义为:2.1.4补码表示法1.模和同余为了实现理解补码表示法,首先需要引入模和同余的概念。模(Module)是指一个计数器的容量,可用M表示。例如:一个4位的二进制计数器,当计数器从0计到15之后,再加1,计数值又变为0。这个计数器的容量M=24=16,即模为16。由此可见,纯小数的模为2,一个字长为n+1位的纯整数的模为2n+1。同余概念是指两个整数A和B除以同一个整数M,所得余数相同,则称A和B对M同余,即A和B在以M为模时相等的,可写作A=B(modM)对钟表而言,其模M=12,故4点和16点、5点和17点、……均是同余,它们可以写作4=16(mod12),5=17(mod12)利用模和同余概念的补码表示法在进行算术运算时可以使减法运算转化成加法运算,从而简化机器的运算器电路。2.补码表示补码的符号位表示方法与原码相同,其数值部分的表示与数的正负有关:对于正数,数值部分与真值形式相同;对于负数,将真值的数值部分按位取反,且在最低位加1。若真值为纯小数,它的补码形式为XS.X1X2…XN,其中XS表示符号位。补码的定义为:3.由真值、原码转换为补码采用补码系统的计算机需要将真值或原码形式表示的数据转化为补码形式,以便于运算器对其进行运算。通常,从原码形式入手求补码。当X为正数[X]补=[X]原=X。当X为负数时,其[X]补等于把[X]原除去符号位外的各位求反后再加上1。反之,当X为负数时,已知[X]补,也可通过对其除符号位外的各位反加1来求得[X]原。当X为负数时,由[X]原转换为[X]补的另一种更有效地方法是:自低位向高位,尾数的第一个1及其右部的0保持不变,左部的各位取反,符号位保持不变。2.1.5反码表示法反码表示法与补码表示法有许多类似之处,对于正数,数值部分与真值形式相同;对于负数,将真值的数值部分按位取反。它与补码的区别是末位少加一个1,因此很容易从补码的定义推出反码的定义。若真值为纯小数,它的反码形式为XS。X1X2…XN,其中XS表示符号位。反码的定义为:2.1.6三种机器数的比较与转换1.比较原码,补码和反码这三种机器码数既有共同点,又有各自不同的性质,主要区别有以下几点:①对于正数它们都等于真值本身,对于负数则各有不同的表示。②最高位都表示符号位,补码和反码的符号位可作为数值位的一部分看待,和数值位一起参加运算;但原码的符号位不允许和数值位同等看待,必须分开进行处理。③对于真值0,原码和反码各有两种不同的表示形式,而补码只有唯一的一种表示形式。④原码、反码表示的正、负数范围相对于零来说是对称的;但补码负数表示范围较正数表示范围宽,能多表示一个最负的数(绝对值最大的负数),其值等于-2n(纯整数)或-1(纯小数)。2.转换三种不同机器码以及真值之间的转换关系如图所示。从图2-1可以看出,真值X与补码反码之间的转换通常是通过原码实现的,如果已熟练掌握了转换方法,也可以直接完成真值与补码或反码之间的转换。如果已知机器的字长,则机器数的位数应补够相应的位数。例如,设机器字长为8位,则:X=1011[X]原=00001011[X]补=00001011[X]反=00001011X=-1011[X]原=10001011[X]补=11110101[X]反=11110100X=0.1011[X]原=0.1011000[X]补=0.1011000[X]反=0.1011000X=-0.1011[X]原=1.1011000[X]补=1.0101000[X]反=1.01001112.2机器数的定点表示与浮点表示2.2.1定点表示法2.2.2浮点表示法2.2.3浮点数阶码的移码表示法2.2.4定点、浮点表示法与定点、浮点计算机2.2.5浮点数尾数的基数2.2.1定点表示法在定点表示法中约定:所有数据的小数点位置固定不变。通常,把小数点固定在有效数位的最前面或末尾,这就形成了两类定点数。1.定点小数定点小数即纯小数,小数点的位置固定在最高有效数位之前、符号位之后,如图所示。定点小数的小数点位置是隐含约定的,小数点并不需要真正地占据一个二进制位。.XSX1Xn-1Xn…n位数值位数符小数点位置(隐含)当XS=0,X1=1,X2=1,…,Xn=1时,X为最大整数,其真值等于:X最大正数=1-2-n当Xn=1,XS=0,X1=0,…,Xn-1=0时,X为最小整数,其真值等于:X最小正数=2-n当XS=1,表示X为负数时,情况要稍微复杂一些,这是因为在计算机中带符号数可用补码表示,也可用原码表示,原码和补码的表示范围有一些差别。若机器数为原码,当XS~Xn均等于1时,X为绝对值最大的负数,其真值等于:X绝对值最大负数=-1综上所述,设机器字长有n+1位,原码定点小数的表示范围为-(1-2-n)~(1-2-n),补码定点小数的表示范围为-1~(1-2-n)。若字长为8位,原码定点小数的表示范围为,补码定点小数的表示范围为。2.定点整数定点整数即纯整数,小数点位置隐含固定在最低有效数位之后,如图所示。综上所述,设机器字长为n+1位,原码定点整数的表示范围为-(2n-1)~(2n-1),补码定点整数的表示范围-2n~(2n-1)。若字长为8位,原码定点整数的表示范围为-127~127,补码定点整数的表示范围为-128~127。在定点表示法中,参加运算的数以及运算结果都必须保证落在该定点数所能表示的数值范围内,如果结果大于最大正数和小于绝对值最大的负数,统称为“溢出”。这是计算机将暂时中止运算操作,而进行溢出处理。.XSX1Xn-1Xn…n位数值位数符小数点位置(隐含)需要说明的是,现代计算机中大多只采用整数数据表示,小数则通过浮点数表示来实现。根据前述方法不难推出:X最大正数=2n-1X最小正数=1X绝对值最大负数=-(2n-1)(原码表示时)X绝对值最大负数=-2n(补码表示时)2.2.2浮点表示法在科学计算中,计算机处理的数往往是混合数,他既有整数部分又有小数部分,如果要将这些数变为上述约定的两定点数形式,就必须在运算前设定一个比例因子,把原始的数缩小成定点小数或扩大成定点整数,运算后的结果还需要根据比例因子还原成实际的数值,这样会给编程带来很多麻烦。另外,在运算中常常遇到非常大或非常小的数值,如果用同样的比例因子来处理的话,很难兼顾数值的范围和运算精度的要求。因此,在计算机中引入了浮点数表示。让小数点的位置根据需要而浮动,这就是浮数点。例如:N=M×rE公式中:r是浮点数阶码的底,与尾数的基数相同,通常r=2。E和M都是带符号的定点数,E叫做阶码(Exponent),M叫做尾数(Mantissa)。在大多数计算机中,尾数是纯小数,常用原码或补码表示;阶码为纯整数,常用移码或补码表示。1.浮点数的表示范围设某浮点数的格式如图所示,k和n分别表示阶码和尾数的数值位位数(不包括符号位),尾数和阶码均用补码表示。当es=0,ms=0,阶码和尾数的数值位各位全为1(即阶码和尾数都为最大整数)时,该浮点数为最大正数:X最大正数=1-2-n当es=1,ms=0,尾数的最低为mn=1,其余各位为0(即阶码为绝对值最大的负数,尾数为最小正数)时,该浮点数为最小正数:X最小正数=2-n×2-2k-1当es=0,阶码的数值位为全1;mn=1,尾数的数值位为全0(即阶码为最大正数,尾数为绝对值最大的负数)时,该浮点数为绝对值最大负数:X绝对值最大负数=-1×22k-11位k位1位n位emesms阶码部分E尾数部分M2.规格化浮点数为了提高运算的精度,需要充分的利用尾数的有效数位,通常采取浮点数规格化形式,即规定尾数的最高位必须是一个有效值。一个浮点数的表示形式并不是唯一的。例如:二进制数0.0001101可以表示为0.001101×2-01、0.01101×2-10、0.1101×2-11……而其中只有0.1101×2-11是规格化数,这就如同十进制实数中的科学标识法一样。规格化浮点数的尾数M的绝对值应该在下列范围内:如果r=2,则有。尾数用原码表示时,规格化浮点数的尾数的最高数位总等于1。在尾数用补码表示时,规格化浮点数应满足尾数最高位与符号位不同(ms⊕m1=1),即当时,应有0.1××…×形式;当时,应有1.0××…×形式。注意:当时,对于原码来说,这是一个规格化数,而对于