数据的表示与运算
要点
- 浮点数的加减运算,注意规格化与舍入处理
- 溢出的基本概念与判别方法及
- 各种进制之间的相互转换及各种机器码的表示方式(源码、反码、补码及移码)
- 定点数的有无符号表示及加减乘除运算
- 各种校验码
- IEEE 754标准
- 算术逻辑单元的功能和结构
- 加法器内部结构及各种进制链的基本原理
数制和编码
进制计数制与其相互转换
1、进制的概念
进制(数制)也叫计数制,指用一组固定的符号和统一的规则来表示数值的方法。按照进位的方法进行计数,称为进位计数制。在我们的日常生活和计算机中,采用的都是进位计数制。一般来说比较常见的进位计数制包括二进制、八进制、十进制和十六进制。
十进制(decimalism)
日常生活中的进位计数制都是十进制。十进制表示方式为(123456789)10、1234567890。十进制用从0到9十个数字表示。
二进制(Binary)
二进制是计算机中使用最广泛的一种数制,使用0和1两个数码来表示。二进制的基数为2,通常高电平为1,低电平为0。进制规则是逢二进一,借位规则是借一当二。表示方式为(1011)2,1101B。
八进制(Octal)
规则和二进制相似,由0~7表示数码,进位规则是逢八进一,借位规则是借一当八。表示方式为(12345670)8,12345679Q(这里不用O的原因是怕把O和0混淆)
十六进制(Hexadecimal)
十六进制由0~9,A~F(a~f)表示数码,进位规则是逢十六进一,借位规则是借一当十六。表示方式为(1234567890ABCDEF)16,0x1234567890ABCDEF。
二进制由17世纪德国数理哲学家莱布尼茨发明,二进制具有实现简单,适合计算机运算、可靠性高等优点,但同时也存在着不足,如表示的效率低,不便于书写,当数码很大时书写起来特费事。于是便引进了八进制和十六进制。
进制的相互转换
二进制与八进制的互转
方法:三位一体采用421法则,从后往前数,每三个数为一体,不足补0;小数点的转换方法和整数一样,只不过小数是往后面补0。
注意:补位是往前补位,都是从后往前数,只有前面的数不够才需要补位,补位补的都是0,比如我下面的这个数三位一体前面的数显然是不够的
二进制转八进制
八进制转二进制
这里解释一下为什么用三位一体421法,三位一体是因为八进制多表示到7,而三个为1 的二进制数正好表示7,421是因为4+2+1正好等于7,这个421是由8421(二进制和十六进制的互转)演化而来的。
二进制与十进制的互转
二进制转十进制
方法:把数码一一排开,从后面往前数,并用0、1、2十个数字对其进行标注,然后找进制里面为1的数,然后用把标注的数变成2的幂数,再逐一相加;小数就是2的负数幂相加和整数一样只是2的幂变成了负数,另外需要注意小数没有0,也就是说小数是从-1开始的。
十进制转二进制
方法:找离当前的这个十进制最近,但比十进制小的2的倍数,然后逐一相加直至全等与当前的十进制,然后按位数填1
小数转换的方法是用小数乘2,每次取1然后用剩下的数继续乘2 再取1,如此往复直到为0。
二进制与十六进制互转
方法:四位一体8421法则,从后往前数,每四个数为一体,不足补0;小数点的转换方法和整数一样,只不过小数是往后面补0。
十六进制转二进制
其他进制的相互转换都是以二进制为基础,比如八进制转十六进制需要先把八进制转为二进制然后再转为十六进制,这里就不过多述说了,只要会二进制、八进制、十进制和十六进制之间相互转换其他的都以二进制为媒介去转就行了。
BCD码(Binary-Coded Decimal,BCD)
二进制编码的十进制数,是以二进制数来编码表示十进制的0~9。具体的编码规则根据不同的BCD码而有所不同。
常见的BCD码分为两类:
- 有权BCD码:8421(最常用)、2421、5421等
- 无权BCD码:余3码、格雷码等等
注意:一般不加以说明的都是指8421 BCD码,考研基本上也只需要掌握8421 BCD码就行了。
(1)8421 码
8421 码就是使用四位二进制数来表示一个十进制数,其二进制数每位的权重由高到低分别是8、4、2、1.意思就是对一个多位的十进制数来说,将它的每一位"替换"成相应的4位二进制代码,再用十六进制数C来表示"+"号,用D来表示"-"号,而且都放在数字串的最后,于是便得到该十进制数的8421 BCD码表示,但是在十进制数的位数为偶数时,需要在第一个字节的高4位补0。
注意:8421 码遇见1001就会产生进位,而不像普通的二进制码,遇到111才产生进位10000。
(2)2421 码
2421 码是另外一种有权码,与8421 码不同之处在于其最高权重是2而不是8。需要注意的是2421 码表示十进制数时,若十进制数大于等于5,则2421 码的最高位是1;若十进制数小于5时,2421 码的最高位是0。所以当表示十进制数5时,其对应的2421 码应该是1011而不是0101,0101在2421 码中就是一种非法编码。
(3)余3码
余3码是一种无权的BCD码,是在8421 码的基础上,加上十进制数3形成的,因而称其为余3码。
字符与字符串
1、ASCII码
美国信息交换标准代码,计算机中的信息包括各种数据信息和控制信息,数据信息又可以分为数值和非数值信息。非数值信息和控制信息包括各种字母、各种控制符号、图形符号等,它们都以二进制编码方式存入计算机并得到处理,这种对字母和符号进行编码的二进制代码称为字符代码(Character Code)。在计算机中,最常用的字符编码是ASCII码。
基本的ASCII码字符集共有128个字符,其中96个是可打印字符,包括常用的数字、字母、标点符号等,另外还有32个控制字符。一般我们只要记住字母和数字的ASCII码就行了,其中"A"的ASCII码是65,"a"的ASCII码是90,所以"A"~"a"之间间隔25,就考研以中国规律来快速推断出从"A"~"z"之间各个字母的ASCII码。
2、汉字编码
汉字编码主要包括汉字的输入码、汉字机内码和汉字字形吗三种。区位码和国际码是输入码。区位码是国家标准局于1981年颁布的标准,用两个字节表示应该汉字,每个字节用7位二进制编码,将汉字和图形符号排列在一个94×94(94的二进制表示需要7位二进制数)的二维代码表中。国际码是将十进制的区位码转换成十六进制后,再在每个字节加上20H,即加上2020H。若将国际码的两个字节的最高位都改为1,就是汉字机内码。因此三种汉字编码的关系为(十六进制表示):
3、字符串大小端的存放
字符串就是字符的集合,在计算机的存储中,通常在存储器中占用连续多个字节空间,每个字节存储一个字符(汉字字符串是两个字节存储一个汉字)。有种情况是当主存字由2个或者4个字节组成时,在同一个主存字中,既可以按从低位字节向高位字节的顺序存放字符串的内容,也可以按从高位字节向低位字节的顺序存放字符串的内容,中国取决于使用的机器(会在后面详细讲解高低字节的区别,即大小端)。
校验码
检错编码:就是通过一定的编码和解码,在接收端解码时检查出传输的错误,但不能纠正错误。常见的检错编码有奇偶校验码和循环冗余校验码(CRC)。
1、奇偶校验码
是在信息码的基础上加一位校验码,可以加在信息码的前面或者后面,分为奇校验和偶校验
奇校验:添加一位校验码后使整个码里面1的个数是奇数;接收端接收到数据后就校验数据里面的1的个数,如果正好是奇数就认为传输没有出错;如果校验到偶数个1就说明传输过程中数据发生了变化,请求重发。
偶校验:添加一位校验码后使整个码里面1的个数是偶数;接收端接收到数据后就校验数据里面的1的个数,如果正好是偶数就认为传输没有出错;如果校验到奇数个1就说明传输过程中数据发生了变化,请求重发。
由此可以看出,有一位数据发生变化,通过奇偶校验码是能够检测出来的,但是并不知道是哪位出错了;如果数据同时有两位数发生变化,则奇偶校验是检测不到数据出错的,因此它的查错能力有限。
补:奇偶校验码实际使用时又分为垂直奇偶校验、水平奇偶校验和水平奇偶校验。
2、循环冗余校验码(CRC)
由于奇偶校验码的检错率较低,不太实用。目前在计算机网络和数据通信中,使用最广泛的就是检错率高、开销小、易于实现的循环冗余校验码。
循环冗余校验码又叫多项式校验码,它的构造过程与多项式的运算有关。
M(x)代表发送信息的多项式;G(x)是生成多项式,代表校验位信息。
以下面这个例子展示循化冗余码的构造过程
以M(x)为例,由多项式导出他对应二进制码的过程
多项式各项次数代表位置,其系数为该位置上二进制位的值,因此从左往右第3位到第0位的二进制值分别是1001。
将M(x)所表示的二进制左移至G(x)的最高次数,这里是往左移3位,得到1001000。
将1001000对1011做模2除法然后得到余数为110,将它与被除数1001合并得到100110,这就是循环冗余校验码。
下面对关于模2除法的具体做法进行详细讲解
以10110010000模2除11001
- ,,, ;这里的操作我们可以简化为异或运算,相同为0,不同为1。
- 上商的规则的看部分余数的首位,如果为1,则商1;为0则商0
- 当部分余数的位数小于除数的位数时,该余数就是最后的余数
循环冗余校验码进行检错的重要性特征
- 具有r检测位的多项式能够检测出所有小于或等于r的突发错误。
- 长度大于r+1的错误逃脱的概率是 1/
注意:循环冗余校验码只有在生成多项式选得非常合适的情况下才能具有纠错功能,这通常是很可能的,因此可默认循环冗余码没有纠错功能,我们只需要掌握其检错功能就可以。
3、海明码
纠错编码:就是在接收端不但可以检查出错误,还可以纠正查出来的错误。
海明码又称为汉明码,是在信息字段中插入若干数据,用于监督码字里面的哪一位数据发生了变化,具有一位纠错能力。
设信息位有k位,整个码字的长度就是k+r;每一位的数据只有两种状态(0和1),有r位数据就应该能表示出种状态。若每种状态代表应该码元发生了一个错误,则有k+r位码元,就要有k+r种状态来表示,另外还要有一种状态来表示正确的情况,才能检查出一位错误,即 。
用D = 101101这串二进制数的海明码,对应以下步骤进行
海明码求解步骤如下:
1. 确定校验码的位数r
数据的位数k = 6,按照上面介绍的公式来计算满足条件r的最小值,如下:
, 即
解这个不等式,满足不等式的最小 r = 4,就是说 D = 101101 的海明码应该有 6 + 4 = 10 位,其中原数据有6位,校验码4位。
2. 确定校验码的位置
假设4位校验码分别是,,,;6位数据码从左往右为,……,编码后的数据共有,…… 。校验码 (i取1、2、3、4)在编码中的位置为 ,见下表
3. 确定数据的位置
这个就很简单,除了校验码的位置,其余的就是数据的位置了,填进去就行了。把数据信息先填进去后再求出校验位的值(最关键的部分)。见下表
4. 求出校验位的值
每个数据码都由多个校验码共同校验,但是要满足一个条件:被校验的数据码的海明位号等于校验该数据码的各校验码的海明位号之和,并且校验码不需要再被校验。
真值和机器数
在我们日常生活中经常看到+5、-9、-4.5、+9.7等等,这些带有“+”或者“-”的数就叫真值。计算机不认识“+”或者“-”但又要处理这些数,由于“+”和“-”是两种状态所以就可以使用二进制的0和1 来表示,而且规定了0表示+,1表示-。这样就可以将一个真值完全数字化了,而被数字化的数就叫机器数(机器数分为原码、反码、补码)