五、计算机数据表示
1.二进制计数制
引入二进制数字系统的计算机结构和性能具有如下的优点:
(1)技术实现容易。
(2)二进制运算规则简单。
(3)计算机中二进制数的0、1数码与逻辑代数变量值0与1吻合,所以二进制同时可以使计算机方便地进行逻辑运算。
(4)二进制数和十进制数之间的关系亦不复杂。
2.任意进制计数制和十进制计数制的相互转换
十进制数转换成二进制数:
十进制数据转换为二进制数时,因整数部分与小数部分转换算法不同,需要分别进行。
(1)整数转换方法———除基取余法
十进制整数除以2取余数作最低位系数k 0 ,再取商的继续除以2取余数作高一位的系数,如此继续直到商为0时停止,最后一次的余数就是整数部分最高有效位的二进制系数,依次所得到的余数序列就是转换成的二进制数。因为除数2是二进制的基数,所以这种算法称作“除基取余”法。
(2)小数转换方法———乘基取整法
把十进制小数乘以2,取其积的整数部分作为对应二进制小数的最高位系数k -1 ,再取积的纯小数部分乘以2,新得积的整数部分又作下一位的系数k -2 ,再取其积的纯小数部分继续乘2,…,直到乘积小数部分为0时停止,这时乘积的整数部分是二进制数最低位系数,每次乘积得到的整数序列就是所求的二进制小数,这种方法每次乘以基数取其整数作系数。所以叫乘基取整法。需要指出的是并不是所有十进制小数都能转换成有限位的二进制小数并出现乘积的小数部分0的情况,有时整个换算过程会无限进行下去,此时可以根据要求并考虑计算机字长,取一定长度的位数后四舍五入,这时得到的二进制数是原十进制数的近似值。
一个既有整数部分又有小数的数送入计算机后,由机器把整数部分按“除基取余”法,小数部分按“乘基取整”法分别进行转换,然后合并。任意进制数转换成十进制数:
任意一种进位计数制的数转换成十进制数的方法都是一样的。把任意进制数按权展开成多项式和的形式,把各位的权与该位上的数码相乘,乘积逐项相加,其和便是相应的十进制数。十进制数转换成任意进制数:
十进制数转换成任意进制数与十进制数转换成二进制数的方法完全相同,即整数部分用除基取余的算法,小数部分用乘基取整的方法,然后将整数与小数拼接成一个数作为转换的最后结果。
3.数的机器码表示
符号数的机器码表示:
(1)机器数和真值
数在计算机中的表示形式统称为机器数。机器数有两个基本特点,其一,数的符号数值化。实用的数据有正数和负数,因为计算机只能表示0、1两种状态,数据的正号“+”或负号“-”,在机器里就用一位二进制的0或1来区别。通常这个符号放在二进制数的最高位,称符号位,以0代表符号“+”,以1代表符号“-”,这样正负符号就被数值化了。因为有符号占据一位,数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。
机器数的另一个特点是二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长8位叫一个字节(Byte),现在机器字长一般都是字节的整数倍,如字长8位、16位、32位、64位。
符号位数值化之后,为能方便的对机器数进行算术运算、提高运算速度,计算机设计了多种符号位与数值一起编码的方法,最常用的机器数表示方法有三种:原码、反码和补码。
(2)原码表示法和反码表示法
一个机器数X由符号位和有效数值两部分组成。设符号位为X 0 ,X真值的绝对值|X|=X 1 X 2 …X n ,X的机器数原码表示为:
[X]原 =X0X1X2…Xn
当 X≥0时,X0 =0
当 X<0时,X0 =1
原码表示很直观,但原码加减运算时符号位不能视同数值一样参加运算,运算规则复杂,运算时间长,而计算机大量的数据处理工作是加减运算,原码表示就很不方便了。
一个负数的原码符号位不动,其余各位取相反码就是机器数的另一种表示形式———反码表示法。正数的反码与原码相同。
设[X]原 =X0X1X2…Xn
当 X0 =0时,[X]反 =X0X1X2…Xn
当 X0 =1时,[X]反 =X0X1X2…Xn
(3)补码表示法(complement)
设计补码表示法的目的是:①使符号位能和有效数值部分一起参加数值运算从而简化运算规则,节省运算时间。②使减法运算转化成加法运算,从而进一步简化计算机中运算器的线路设计。计算机是一种有限字长的数字系统,因此都是有模运算,超过模的运算结果都将溢出。n位二进制整数的模是2 n 。
对于二进制数还有一种更加简单的方法由原码求得补码。①正数的补码表示与原码一样,[X] 补 =[X] 原
②负数的补码是将原码符号位保持“1”之后其余各位取相反的码,末位加1便得到补码,即取其原码的反码再加1∶[X] 补 =[X] 反 +1。
真值+0和-0的补码表示是一致的,但在原码和反码表示中具有不同的形式。8位补码机器数可以表示-128,但不存在+128的补码,由此可知8位二进制补码能表示数的范围是-128~+127。应该注意,不存在-128的8位原码和反码形式。
根据互补的概念,一个补码机器数再求一次补就得到机器数的原码了。定点数与浮点数:
(1)定点数(fixed-point number)
计算机处理的数据不仅有符号,而且大量的数带有小数,小数点不占有二进制位而是隐含有机器数里某固定位置上。通常采用两种简单的约定:一种是约定所有机器数的小数点位置隐含在机器数的最低位之后,叫定点纯整数机器数,简称定点整数。
另一种约定是所有机器数的小数点位置隐含在符号位之后、有效数值部分最高位之前,叫定点纯小数机器数,简称定点小数。
计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按比例因子缩小成定点小数或扩大成定点整数再参加运算,结果输出时再按比例折算成实际值。n位原码定点整数的表示范围是-(2 n-1 -1)≤X≤2 n-1 -1,n位原码定点小数的表示范围是-(1-2 -(n-1) )≤X≤1-2 -(n-1) 。当机器数小于定点数的最小值时,被当作0处理,超出定点数的最大值时,机器无法表达,称作“溢出”,此时机器将停止运算,屏幕显示溢出警告。
定点数表示方法简单直观,不过定点数表示数的范围小,不易选择合适的比例因子,运算过程容易产生溢出。
(2)浮点数(floating-point number)
计算机采用浮点数来表示数值,它与科学计算法相似,把任意一个二进制数通过移动小数点位置表示成阶码和尾数两部分:N=2 E ×S
其中:E———N的阶码(exponent),是有符号的整数;
S———N的尾数(mantissa),是数值的有效数字部分,一般规定取二进制定点纯小数形式。
浮点数运算必须化成规格化形式。所谓规格化,对于原码尾数应使最高数字位S 1 =1,如果不是1,且尾数不是全为0时就要移动尾数直到S 1 =1,阶码相应变化,保证N值不变。如果尾数是补码,当N是正数时,S 1 必须是1,而N是负数时,S 1 必须是0,才称为规格化的形式。
4.数字编码
十进制数在机内转换成二进制数时,有时也以一种中间数字编码形式存在,它把每一位十进制数用四位二进制编码表达,每一组只表达0~9的数值运算时,有专门的电路在每四位二进制间按“十”进位处理,故称为二进制编码的十进制数———BCD码(Binary Coded Decimal)或称二—十进制数。其编码种类很多,如格雷码、余3码等,最常用的叫8421BCD码,4个二进制位自左向右每位的权分别是8、4、2、1。0~9的8421码与通常的二进制一样进位,十分简单,当计数超过9时,需要采取办法自动向十进制高位进一,即要进行“十进制调整”才能得到正确结果。
5.校验码
由于器件质量不可靠、线路工艺不过关、远距离传送带来的干扰或受来自电源、空间磁场影响等因素,使得信息在存取、传送和计算过程中难免会发生诸如“1”误变为“0”的错误,计算机一旦出错,要能及时检测并纠正错误,其中一种方法是对数据信息扩充,加入新的代码,它与原数据信息一起按某种规律编码后具有发现错误的能力,有的甚至能指出错误所在的准确位置使机器自动纠正,能起这种作用的编码叫“校验码”(check code)。
奇偶校验码:
将每个数据代码扩展一个二进位作校验位(parity bit),这个校验取0还是取1的原则是:若是奇校验(odd parity),编码是含“1”的个数连同校验位的取值在内共有奇数个“1”;若是偶校验(even parity),连同校验位在内编码里含“1”的个数是偶数个。
交*校验:
计算机进行大量字节传送时一次传送几百甚至更多字节组成的数据块,如果不仅每一个字节有一个奇偶校验位———称横向校验,而且全部字节的同一位也设置了一个奇偶校验位———称纵向校验,对数据块代码的横向纵向同时校验,这种情况叫交*校验。循环冗余校验码———CRC码(Cyclic Redundancy Check):
计算机信息传向远方终端或传到另一个计算中心时,信息沿一条通信线路一位位传送,这种通信方式叫串行通信。循环冗余码(简称CRC码)就是一种检验能力很强,在串行通信中广泛采用的校验编码。
(1)CRC码
串行传送的信息M(X)是一串k位二进制序列,在它被发送的同时,被一个事先选择的“生成多项式”相除,“生成多项式”长r+1位,相除后得到r位余数就是校验位,它拼接到原k位有效信息后面即形成CRC码。CRC码到达接收方时,接收方的设备一方面接收CRC码,一方面用同样的生成多项式相除,如果正好除尽,表示无信息差错,接收方去掉CRC码后面r位校验位,收下k位有效信息;当不能除尽时,说明有信息的状态位发生了转变,即出错了。一般要求重新传送一次或立即纠错。
(2)CRC码计算
传送信息时生成CRC码以及接收时对CRC码校验都要与“生成多项式”相除,这里除法是“模2运算”,即二进位运算时不考虑进位和借位。作模2除法时,取商的原则是当部分余数首位为1时商取1,反之商取0,然后按模2减,求部分余数。这个余数不计高位。当被除数逐位除完时,最后余数的位数比除数少一位。该余数就是校验位。它拼接在有效信息后面组成CRC码。因为校验位扩充了传送部分的代码,所以这是一种基于“冗余校验”的思想的校验办法。
(3)生成多项式
CRC码是M(X)除以某一个预先选定的多项式后产生的,所以这个多项式叫生成多项式。并不是任何一个r+1位的编码都可以作生成多项式用,它应能满足当任何一位发生传送错误时都能使余数不为0,并且不同位发生错误时应当使余数也不同,这样不但能检错而且能推断是哪一位出错,从而有利于准确的纠错。有两个生成多项式,其检错率很高。
X16+X15+X2+1
X16+X12+X6+1