1.2 数制与编码
在计算机中,任何命令和信息都是以二进制数据的形式存储的。计算机所执行的全部操作都归结为对数据的处理和加工,为了便于理解计算机系统的基本工作原理,掌握数字、字母等字符在计算机系统中的表示方法及处理过程,本节主要介绍计算机中使用的数制和编码等方面的基础知识。
1.2.1 数制及其转换
数制就是计数方式。
日常生活中常用的是十进制计数方式,计算机内部使用的是二进制数据,在向计算机输入数据及输出数据时,人们惯于用十进制、十六进制数据等,因此,计算机在处理数据时,必须进行各种数制之间的相互转换。
1.二进制数
二进制数只有两个数字符号:0和1。计数时按“逢二进一”的原则进行计数,也称其基数为二。一般情况下,二进制数可表示为(110)2、(110.11)2、10110B等。
根据位权表示法,每一位二进制数在其不同位置表示不同的值。例如:
对于8位二进制数(低位~高位分别用D0~D7表示),则各位所对应的权值为
对于任何二进制数,可按位权求和展开为与之相应的十进制数。
(10)2=1×21+0×20=(2)10
(11)2=1×21+1×20=(3)10
(110)2=1×22+1×21+0×20=(6)10
(111)2=1×22+1×21+1×20=(7)10
(1111)2=1×23+1×22+1×21+1×20=(15)10
(10110)2=1×24+0×23+1×22+1×21+0×20=(22)10
例如,二进制数10110111,按位权展开求和计算可得:
(10110111)2=1×27+0×26+1×25+1×24+0×23+1×22+1×21+1×20
=128+0+32+16+0+4+2+1
=(183)10
对于含有小数的二进制数,小数点右边第一位小数开始向右各位的权值分别为
例如,二进制数10110.101,按位权展开求和计算可得:
(10110.101)2=1×24+1×22+1×21+1×2-1+0×2-2+1×2-3
=16+4+2+0.5+0.125
=(22.625)10
必须指出:在计算机中,一个二进制数(如8位、16位或32位)既可以表示数值,也可以表示一种符号的代码,还可以表示某种操作(即指令),计算机在程序运行时按程序的规则自动识别,这就是本节开始所提及的,即一切信息都是以二进制数据进行存储的。
2.十六进制数
十六进制数是学习和研究计算机中二进制数的一种比较方便的工具。计算机在信息输入/输出或书写相应程序或数据时,可采用简短的十六进制数表示相应的位数较长的二进制数。
十六进制数有16个数字符号,其中0~9与十进制相同,剩余6个为A~F,分别表示十进制数的10~15,见表1-1。十六进制数的计数原则是“逢十六进一”,也称其基数为十六,整数部分各位的权值由低位到高位分别为:160、161、162、163……
例如:(31)16=3×161+1×160=(49)10
(2AF)16=2×162+10×161+15×160=(687)10
为了便于区别不同进制的数据,一般情况下可在数据后面跟一个后缀。
● 二进制数用“B”表示(如00111010B)。
● 十六进制数用“H”表示(如3A5H)。
● 十进制数用“D”表示(如39D或39)。
3.不同数制之间的转换
前面已提及,计算机中的数只能用二进制表示,十六进制数适合读写方便的需要,日常生活中使用的是十进制数,计算机必须根据需要对各种进制数据进行转换。
(1)二进制数转换为十进制数
对任意二进制数均可按权值展开,将其转化为十进制数。
例如:10111B=1×24+0×23+1×22+1×21+1×20=23D
10111.011B=1×24+0×23+1×22+1×21+1×20+0×2-1+1×2-2+1×2-3
=23.375D
(2)十进制数转换为二进制数
1)方法1。十进制数转换为二进制数,可将整数部分和小数部分分别进行转换,然后合并。其中整数部分可采用“除2取余法”进行转换,小数部分可采用“乘2取整法”进行转换。
例如:采用“除2取余法”将37D转换为二进制数。
把所得余数由高到低排列起来可得:
37=100101B
例如:采用“乘2取整法”将0.625转换为二进制数小数。
把所得整数由高到低排列起来可得:
0.625=0.101B
同理,把37.625转换为二进制数,只需将以上转换合并起来可得:
37.625=100101.101B
2)方法2。可将十进制数与二进制位权从高位到低位进行比较,若十进制数大于或等于二进制某位,则该位取“1”,否则该位取“0”,采用按位分割法进行转换。
例如,将37.625转换为二进制数。
将整数部分37与二进制各位权值从高位到低位进行比较,37>32,则该位取1,剩余37-32=5,逐位比较,得00100101B。
将小数部分0.625按同样方法,得0.101B。
结果为37.625D=100101.101B。
(3)二进制数与十六进制数的相互转换
在计算机进行输入、输出时,常采用十六进制数。十六进制是二进制数的简化表示。
因为24=16,所以4位二进制数相当于1位十六进制数,二进制、十进制、十六进制对应的转换关系见表1-1。
表1-1 二进制、十进制、十六进制转换表
(续)
在将二进制数转换为十六进制数时,其整数部分可由小数点开始向左每4位为一组进行分组,直至高位。若高位不足4位,则补0使其成为4位二进制数,然后按表1-1对应关系进行转换。其小数部分由小数点向右每4位为一组进行分组,不足4位则末位补0使其成为4位二进制数,然后按表1-1所示的对应关系进行转换。
例如:1000101B=0100 0101B=45H
10001010B=1000 1010B=8AH
100101.101B=0010 0101.1010B=25.AH
需要将十六进制数转换为二进制数时,则为上述方法的逆过程。
例如:45.AH=0100 0101.1010B
例如:
即7ABFH=111101010111111B
(4)十进制数与十六进制数的相互转换
十进制数与十六进制数的相互转换可直接进行,也可先转换为二进制数,然后再把二进制数转换为十六进制数或十进制数。
例如,将十进制数37D转为十六进制数。
37D=100101B=00100101B=25H
例如,将十六进制数41H转换为十进制数。
41H=01000001B=65D
也可按位权展开求和方式将十六进制数直接转换为十进制数,这里不再详述。
1.2.2 编码
计算机通过输入设备(如键盘)输入信息和通过输出设备输出信息是多种形式的,既有数字(数值型数据),也有字符、字母、各种控制符号及汉字(非数值型数据)等。计算机内部所有数据均用二进制代码的形式表示,前面所提到的二进制数,没有涉及正、负符号问题,实际上是一种无符号数的表示,在实际问题中,有些数据确有正、负之分。为此,需要对常用的数据及符号等进行编码,以表示不同形式的信息。这种以编码形式所表示的信息既便于存储,也便于由输入设备输入信息、输出设备输出相应的信息。
1.二进制数的编码
(1)机器数与真值
一个数在计算机中的表示形式称为机器数,而这个数本身(含符号“+”或“-”)称为机器数的真值。
通常在机器数中,用最高位“1”表示负数,“0”表示正数(以下均以8位二进制数为例)。
例如,设两个数为N1、N2,其真值为
N1=105=+01101001B
N2=-105=-01101001B
则对应的机器数为
N1=0 1101001B(最高位“0”表示正数)
N2=1 1101001B(最高位“1”表示负数)
必须指出,对于一个有符号数,可因其编码不同而有不同的机器数表示法,如下面将要介绍的原码、反码和补码。
(2)原码、反码和补码
1)原码。按上所述,正数的符号位用“0”表示,负数的符号位用“1”表示,其数值部分随后表示,称为原码。
例如,仍以上面N1、N2为例,则
[N1]原=0 1101001B
[N2]原=1 1101001B
原码表示方法简单,便于与真值进行转换。但在进行减法时,为了把减法运算转换为加法运算(计算机结构决定了加法运算),必须引进反码和补码。
2)反码、补码。在计算机中,任何有符号数都是以补码形式存储的。对于正数,其反码、补码与原码相同。
例如,N1=+105则[N1]原=[N1]补=[N1]反=0 1101001B。
对于负数,其反码为:原码的符号位不变,其数值部分按位取反。
例如,N2=-105则[N2]原=1 1101001B,[N2]反=1 0010110B。
负数的补码为:原码的符号位不变,其数值部分按位取反后再加1(即负数的反码+1),称为求补。
例如,N2=-105,则
[N2]补=[N2]反+1
=1 0010110B+1=1 0010111B
如果已知一个负数的补码,可以对该补码再进行求补码(即一个数补码的补码),即可得到该数的原码,即[[X]补]补=[X]原,而求出真值。
例如,已知[N2]补=1 0010111B,则[N2]原=11101000B+1=11101001B。
可得真值:N2=-105。
对采用补码形式表示的数据进行运算时,可以将减法转换为加法。
例如,设X=10,Y=20,求X-Y。
X-Y可表示为X+(-Y),即10+(-20)。
[X]原=[X]反=[X]补=00001010B
[-Y]原=10010100B
[-Y]补=[-Y]反+1=11101011B+1=11101100B
则有[X+(-Y)]补=[X]补+[-Y]补
=00001010B+11101100B(按二进制相加)
=11110110B(和的补码)
再对[X+(-Y)]补求补码可得[X+(-Y)]原,即
[X+(-Y)]原=10001001B+1=10001010B
则X-Y的真值为-10D。
必须指出:所有负数在计算机中都是以补码形式存放的。对于8位二进制数,作为补码形式,它所表示的范围为-128~+127;而作为无符号数,它所表示的范围为0~255。对于16位二进制数,作为补码形式,它所表示的范围为-32 768~+32 767;而作为无符号数,它所表示的范围为0~65 536。因而,计算机中存储的任何一个数据,由于解释形式的不同,所代表的意义也不同,计算机在执行程序时自动进行识别。
例如,某计算机存储单元的数据为84H,其对应的二进制数表现形式为10000100B,该数若解释为无符号数编码,其真值为128+4=132;该数若解释为有符号数编码,最高位为1可确定为负数的补码表示,则该数的原码为11111011B+1B=11111100B,其真值为-124;该数若解释为BCD编码,其真值为84D(下面介绍);若该数作为8051单片机指令时,则表示一条除法操作(见附录A)。
2.二-十进制编码
二-十进制编码又称BCD编码。BCD编码既具有二进制数的形式,以便于存储;又具有十进制数的特点,以便于进行运算和显示结果。在BCD码中,用4位二进制代码表示1位十进制数。常用的8421BCD码的对应编码见表1-2。
表1-2 二-十进制编码(8421BCD码)
例如,将27转换为8421BCD码,即
27D=(0010 0111)8421BCD码
将105转换为8421BCD码,则
105D=(0001 0000 0101)8421BCD码
因为8421BCD码中只能表示0000B~1001B(0~9)这10个代码,不允许出现代码1010B~1111B(因其值大于9),因而,计算机在进行BCD加法(即二进制加法)过程中,若和的低四位大于9(即1001B)或低四位向高四位有进位时,为保证运算结果的正确性,低四位必须进行加6修正。同理,若和的高四位大于9(即1001B)或高四位向更高四位有进位时,为保证运算结果的正确性,高四位必须进行加6修正。
例如,17=(0001 0111)8421BCD
24=(0010 0100)8421BCD
17+24=41在计算机中的操作为
3.ASCII码
以上介绍的是计算机中的数值型数据的编码,对于计算机中非数值型数据,包括以下几种。
● 十进制数字符号:“0”,“1”,…,“9”(不是指数值)。
● 26个大小写英文字母。
● 键盘专用符号:“#”“$”“&”“+”“=”。
● 键盘控制符号:“CR”(回车)“DEL”等。
上述这些符号在由键盘输入时不能直接装入计算机,必须将其转换为特定的二进制代码(即将其编码),以二进制代码所表示的字符数据的形式装入计算机。
ASCII(American Standard Code for Information Interchange)码是一种国际标准信息交换码,它利用7位二进制代码来表示字符,再加上1位校验位,故在计算机中用1个字节即8位二进制数来表示一个字符,这样有利于对这些数据进行处理及传输。常用字符的ASCII码表示见表1-3。
表1-3 常用字符的ASCII码
(续)
ASCII(美国标准信息交换码)码见附录B。