2.1 数据与文字的编码
数字计算机中采用二进制的数据表示方式,因为二进制数能方便可靠地用数字电路的逻辑电平表示。
在计算机中表示的二进制数据称为机器数。它是一系列位数固定而且数量有限的二进制代码,表示的数值范围也是有限的。计算机中表示的机器数是一系列离散的数据。一个机器数所代表的实际数值称为真值。
2.2.1 数制的转换
计算机中采用的二进制数采用0和1两个符号表示数值。表示大于2的数时用多个记数符号的排列表示,每一个记数符号也称为一个位。多位数据中每一位记数符号代表的数值是记数符号乘以2的指数的结果。
二进制数便于在计算机中进行存储和计算。但它表示数据时需要用较多的位数,不便于人们书写和记忆。为此,在计算机中还常常把若干个二进制位组合起来,构成八进制数或十六进制数。
八进制数采用0到7这八个数字符号。在十六进制数中,除了采用0到9这十个符号外,还采用字母A到F这六个符号表示一位中大于9的数。
十进制数到二进制的转换可分为整数和小数两种情况。整数的十进制数到二进制数的转换可以采用除二取余的方法。即把十进制数除以二,所得余数作为二进制数的最低位,在除以二,所得余数作为次低位,如此重复,直到商数为零为止。然后将余数连起来形成数据的二进制表示。
对于带有小数的十进制数,在转换成二进制数时则须对小数部分采用按乘2取整数的方法。其规则是:用2去乘待转换的十进制数的小数部分,取乘积的整数部分作为转换后的二进制数中小数部分的最高位数字;在用2去乘上一步乘积的小数部分,再取新乘积的整数部分作为转换后二进制小数低一位数字;不断重复直至乘积部分为0或的到的小数的位数满足要求时结束。然后将整数连起来形成数据的二进制表示。
2.1.2 定点数的编码
定点数是指小数点位置固定不变的数据。在计算机中,通常采用两种类型的定点数表示。一种定点数把小数点定在最低位数的右面,这种定点数称为定点整数,因为它实际没有小数。另一种定点数把小数点固定在最高位数的后面,即纯小数表示,称为定点小数,它只保留小数点后面的数据,小数点前面的一位数据固定为零。这种二进制定点数的表示可以直接在计算机中表示,计算机中表示无符号数就直接用这种二进制的表示作为数据的编码。
计算机中的数据编码都是有一定的表示范围的,离散的;而不像数学中的数可以是任意大的,连续的。
在数据编码中,如果数据值超过了编码所能表示的数值范围,则称为数值溢出。
计算机中表示一个带符号数的方法有:原码表示法、反码表示法、补码表示法和移码表示法四种。
1.原码表示法
原码表示法中用一个符号位表示数据的正负,用0代表正号,1代表负号,其余的代码表示数据的绝对值,称为数值位。
在原码中,零有两种表示方式。即000...0和100...0。
2.补码表示法
补码表示法也是用最高一位代表符号,其余各位代码表示数值。对于一个整数x,补码的编码方式为:正数的补码与原码相同;负数的补码是将x的二进制位按位取反后在为低位上加1。
求一个负数的补码的另一种方法是从最低位开始,对遇到的0和第一个1取其原码,从第一个1之后开始直到最高位(符号位)均按位取其反码。
为了便于判别运算结果是否溢出,某些计算机中还采用一种双符号的补码表示方式,它采用两个相同的符号位,又称为模4补码。对于正数,其双符号位补码的两个符号位为00;对于负数,其双符号位补码的两个符号位为11.也就是说,一般情况下,这两个符号位始终相同,否则表明出现了溢出。
3.反码表示法
反码表示法是用对负值的各位取反的表示方法,反码的最高位也是符号位。0表示正数,1表示负数。对于整数x,反码的编码方法是:正数的反码与原码相同,直接在二进制表示前加上符号位0构成;负数的反码是将x的二进制位按位取反得到。
在反码表示中,零有两个编码,即000...0和111...1。
4.移码表示法
对于n+1位二进制整数x=x0x1...xn,移码的定义为:
[x]移=2n+x
也就是取其加上2n后的二进制数编码,移码的编码方法只是将数据的二进制码加上一个常数2n 。
在带符号的移码表示中,最高位仍可看作是符号位,但1表示正号,0代表负号,将移码与补码相比较,可以发现只是符号位不同,其余位相同。
移码表示中,0有惟一的编码,即100...0。
定点小数没有移码定义,移码的定义仅限于定点整数。
原码、反码和补码这三种表示方法的共同点是:编码的最左位为1时表示一个负数,为0时表示一个正数。而移码则与此相反,1表示正数,0表示负数。
2.1.3 浮点数的编码
在浮点数据编码中,数据代码分为尾数和阶码两部分。尾数表示有效数字,解码表示小数点的位置,加上符号位,浮点数据通常表示为:
N=(-1)s*M*RE
其中S(sign)为数据的符号位,M(mantissa)是浮点数的尾数,R(radix)是基数,E(exponent)是阶码。
为了在尾数中表示最多的有效数据位,同时使浮点数具有惟一的表示方式,浮点数的编码应当采用一定的规范,规定尾数部分用纯小数形式给出,而且尾数的绝对值应大于或等于1/R并小于或等于1,即小数点后的第一位不为零。这种表示的规范称为浮点数的规格化表示方法。
2.1.4 文字的编码
1.西文字符的编码
文字字符编码的方案有多种,目前国际上普遍采用的一种字符编码系统是ASCII(American Standard Code for Information Interchange)。在这种编码标准中规定8个二进制位的最高一位为0,余下的7位可以给出128个编码,表示128个不同的字符,编码范围是0016至7F16 。
2.汉字的编码
在汉字中将输入用的编码和机内码存储的编码分开定义。机内码是汉字在计算机内部进行存储和处理时采用的表示形式,它同样是一种二进制代码。
汉字机内码是用于汉字信息存储、交换、检索等操作的内部代码。
3.十进制数的编码
十进制数据在计算机中主要有两种表示形式:
(1)字符串形式,即一个字节存放一个十进制的数位或符号。用连续的多个字节表示一个完整的十进制数据。
(2)压缩的二进制数串形式,即一个字节存放两个十进制的数位。它比较节省存储空间,又便于进行算术运算。
2.1.5 检错码和纠错码
这种能够发现某些错误或确定错误位置的数据编码称为数据错误校验码,或检错码。
数据校验码把信息序列分成k个码元的组,通过编码器将每组的k个信息代码按一定校验规则产生r个多余码元(校验码),输出长为n=k+r的一个码元组(码字),这种校验码称为分组码。分组码中每一码元组的r个校验码元与本组的数据代码有关,而与别组的数据无关,代码中的错误将引起校验结果的变化。分组码可用(n,k)表示,n表示码长,k表示信息位数目。
1.奇偶校验码
奇偶校验码是一种最简单的检错码,它在每k个信息位中增加一个校验位代码,能发现数据代码中一位出错情况,常用于对存储器数据的检查或者传输数据的检查。增加的冗余位称为奇偶校验位。
偶校验码的构成规则是:所有信息位和单个校验位的模2加等于0,即每个码字(包括校验位)中1的数目为偶数。奇校验码的构成规则是:所有信息位和单个校验位的模2加等于1,即每个码字中1的数目为奇数。
在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离。在一种编码中各个码字间距离的最小值称为该代码的最小码距d0,最小码距是数据编码的一个重要特征。
2.海明码
常见的纠错码有海明码和循环码。海明码能检测出2位错误,并能纠正1位错误。其原理是,在一个数据位组中加入几个校验位,增加数据代码间的最小码距到3,采用多个校验公式对代码进行多重校验,当某一位发生变化时就会引起校验结果发生变化,不同代码的错误会得出不同的校验结果。
3.循环码
循环冗余校验码(CRC)的校验方法是基于模2运算建立有效信息和校验位之间关系的方法。
2.2 定点数加减运算
2.2.1 补码的加减法运算
在数据运算中,参与运算的数据又称为操作数(operand)。补码操作数加减法运算的特点是可以对补码编码的数据直接进行运算,包括符号位。
两个数的补码相加,其结果就是这两个数相加后的补码。
两个数的补码相减,其结果就是这两个数相减后的补码。
2.2.2 溢出的检测方法
对于加法,只在正数加正数和负数加负数两种情况下才会产生溢出,符号不同的两个数相加是不会产生溢出的。对于减法,只在正数减负数和负数减正数两种情况下才会产生溢出,符号相同的两个数相减是不会产生溢出的。
2.2.3 基本的二进制加法/减法器
一位加法器电路有全加器和半加器两种。半加器电路只是对两个输入数据位进行加法,输出一个结果位,不考虑数据的进位,也不产生进位输出。半加法器电路实际上是一个异或门电路。全加器则将两个数据和低位送来的进位输入进行加法运算,输出一个加法结果位和一个向高位输出的进位信号。所以全加器共有3个输入端和2个输出端。
2.3 定点数乘除法运算
2.3.1原码一位乘法
原码乘法将符号位与数值位分开进行运算,对数值位部分进行乘法运算,得到的结果为运算结果的数值部分,再加上运算结果的符号位形成结果的原码。运算结果的数值部分是乘数和被乘数数值位的乘积,运算结果的符号位是乘数和被乘数符号位的异或。
2.3.2 补码的一位乘法
2.3.3 定点数除法运算
手工进行二进制除法的规则是判断被除数与除数的大小,若被除数小,则上商0,并把被除数的下一位移下来或者补0,再用余数和右移一位的除数比;若被除数大则上商1并做减法。
2.4 逻辑运算
在数学逻辑中介绍的逻辑运算是对一位的二进制布尔变量的逻辑运算。在计算机中,指令通常对寄存器中的数据字进行运算。指令的逻辑运算也是对数据字的逻辑运算。
对数据字进行的逻辑运算指的是对于存储在寄存器中的位串进行二进制运算。所谓按位运算就是分别考虑每一位信息并将每一位的信息看作是一个独立的信息,而不是看作是一个数据中的不同的为。逻辑运算中的各个位之间没有相互关系,如在数据运算中的进位或者借位的关系。
最基本的逻辑运算是对数据进行按位的逻辑与、逻辑或、逻辑非等。
1.逻辑非。逻辑非运算对数据的每一位进行求反,将1变成0,0变成1。这种运算称为按位求反,或称按位求非。
2.逻辑加。逻辑加运算就按位求逻辑或的运算。与二进制加法的一个重要区别就是运算是按位进行的,位与位之间没有进位。
3.逻辑乘。逻辑乘运算就是按位求逻辑与的运算。运算按位进行,位与位之间没有进位。
另一类逻辑运算是移位操作。移位操作分为算术移位、逻辑移位和循环移位三种,每种移位操作又有左移和右移之分。算术移位可用于实现乘除法的运算。算术右移保持最高位(符号位)不变,而逻辑右移最高位补零。
2.5定点运算器的组成和结构
定点运算器中一般包括ALU部件、寄存器、多路选择器、移位器和数据通路等。
2.6 浮点数运算和浮点数运算器
2.6.1 浮点数加法和减法
1.对阶
对于带小数点的数据进行加减法运算时,需要把小数点对齐,浮点数加减法也是这样。在浮点数中小数点对齐意味着阶码相等。浮点数加减法的第一步是使得两个数的阶码相等,这称为对阶。
在对阶操作时,总是使小的阶码向大的阶码对齐。
对阶操作的方法是:将原来阶码小的数的尾数部分右移,并相应地增加其阶码,以保持浮点数值不变。由于在右移过程中将最低位移出,所以实际上浮点数值的精度会下降。
2.尾数运算
尾数运算实现尾数的加减运算,执行两个完成对阶后的浮点数的运算。
3.规格化
如果尾数的加减法运算得到的结果不符合规格化要求,就必须进行规格化处理。
4.舍入
在进行浮点运算时,为了保证结果的精度,在运算时的中间值可以多保留一些数据位,称为保护(guard)位。
舍入操作就是消除保护位数据位并按照规则调整剩下的部分。
5.检查阶码是否溢出
浮点数的溢出表现为阶码的溢出。如果阶码正常,运算正常完成;若阶码下溢,要置运算结果为浮点型形式的机器零;若阶码上溢,则置溢出标志。
2.6.2 浮点数的乘法和除法
浮点数的乘除法运算要经过阶码加减、尾数乘除、规格化、舍入操作和判断加过正确性五个步骤。