数制与编码是微型计算机的基本数字逻辑,是学习微型计算机的必备知识。数制与编码的知识一般会在数字电子技术等相关课程中讲解,但由于数制与编码知识与当时课程的联系并不密切,所以在微型计算机原理或单片机的教学中,教师普遍感觉到学生这方面的知识不太扎实。因此,我们在下文将对相关知识进行梳理。
数制就是计数的方法,通常采用进位计数制,在学习与应用微型计算机的过程中,常用的数制有二进制、十进制和十六进制。日常生活中采用的是十进制计数方法。由于微型计算机只能识别和处理数字信息,因此微型计算机硬件电路采用的是二进制计数方法。但为了更好地记忆与描述微型计算机的地址、程序及运算数字,一般采用十六进制计数方法。
1.各种数制及其表示方法
二进制、十进制、十六进制的计数规则与表示方法如表1.1所示。
表1.1 二进制、十进制、十六进制的计数规则与表示方法
注意: i 是各进制数码在数字中的位置, i 值以小数点为界,往左依次为0,1,2,3,…,往右依次为-1,-2,-3,…。
2.数制之间的转换
数值在任意进制之间的相互转换,其整数部分和小数部分必须分开进行。各进制数的相互转换关系如图1.1所示。
1)二进制数、十六进制数转换成十进制数
将二进制数、十六进制数按权值展开式展开,所得数相加,即十进制数。
图1.1 各进制数的相互转换关系
2)十进制数转换成二进制数
十进制数转换成二进制数要将数值分成整数部分与小数部分进行转换,整数部分和小数部分的转换方法是完全不同的。
(1)十进制数的整数部分转换成二进制数的整数部分—“除以2取余”法,将所得余数倒序排列,即可得到二进制数的整数部分,如下所示:
∴(84) 10 =(1010100) 2 。
(2)十进制数的小数部分转换成二进制数的小数部分—“乘2取整”法,将所得整数部分顺序排列,即可得到二进制数的小数部分,如下所示:
∴(0.6875) 10 =(0.1011) 2 。
将上述两部分合起来,则有:
(84.6875) 10 =(1010100.1011) 2
3)二进制数与十六进制数相互转换
(1)二进制数转换成十六进制数。
以小数点为界,往左、往右每4位二进制数为一组,每4位二进制数用1位十六进制数表示,往左高位不够用0补齐,往右低位不够用0补齐。例如:
(111101.011101) 2 =( 0011 1101 . 0111 0100 ) 2 =(3D.74) 16
(2)十六进制数转换成二进制数。
先将每位十六进制数用4位二进制数表示,再将整数部分最高位的0去掉,小数部分最低位的0去掉。例如:
(3C20.84) 16 =( 0011 1100 0010 0000 . 10000100 ) 2 =(11110000100000.100001) 2
3.数制转换工具
利用计算机附件中的计算器(科学型)可实现各数制之间的相互转换。单击任务栏中的“开始”按钮,依次单击“所有程序”→“附件”→“计算器”,即可打开“计算器”窗口,在该窗口中单击菜单栏中的“查看”菜单,选择“科学型”,此时计算器界面即科学型计算器界面,如图1.2所示。
图1.2 科学型计算器界面
转换方法:先选择被转换数制类型,并在文本框中输入要转换的数字,再选择目标转换数制类型,此时,文本框中的数字就是转换后的数字。例如,将96转换为十六进制数、二进制数的步骤为,先选择数制类型为十进制,再在文本框中输入96,然后选择数制类型为十六进制,此时,文本框中看到的数字即转换后的十六进制数60;再选择数制类型为二进制,此时,文本框中看到的数字即转换后的二进制数1100000,如图1.2所示。
4.二进制数的运算规则
(1)加法运算规则:
0+0=0,0+1=1,1+1=0(有进位)
(2)减法运算规则:
0-0=0,1-0=1,1-1=0,0-1=1(有借位)
(3)乘法运算规则:
0×0=0,1×0=1,1×1=1
1.机器数与真值
数学中数的正和负用符号“+”和“-”表示,计算机中如何表示数的正和负呢?在计算机中,数据是存放在存储单元内的。每个存储单元是由若干二进制位组成的,其中每一数位或是0或是l,而数的符号或为“+”或为“-”,因此,可用一个数位来表示数的符号。在计算机中,规定用“0”表示“+”、用“1”表示“-”。用来表示数的符号的数位被称为“符号位”(通常为最高数位),于是数的符号在计算机中就被数码化了,但从表示形式上看,符号位与数值位没有区别。
设有两个数 x 1 , x 2 :
x 1 =+1011011B, x 2 =-1011011B
它们在计算机中分别表示为
x 1 = 0 1011011B, x 2 = 1 1011011B
其中,带下画线部分为符号位,字长为8位。为了区分这两种形式的数,我们把机器中以数码形式表示的数称为机器数( x 1 = 0 1011011B及 x 2 = 1 1011011B),把原来以一般书写形式表示的数称为真值( x 1 =+1011011B及 x 2 =-1011011B)。
若一个数的所有数位均为数值位,则该数为无符号数;若一个数的最高数位为符号位,其他数位为数值位,则该数为有符号数。由此可见,同一个存储单元中存放的无符号数和有符号数所能表示的数值范围是不同的(例如,存储单元为8位,当它存放无符号数时,因有效的数值位为8位,该数的范围为0~255;当它存放有符号数时,因有效的数值位为7位,该数的范围为-128~+127)。
2.原码
对于一个二进制数,如果用最高数位表示该数的符号(0表示“+”,l表示“-”),其余各数位表示数值本身,则称这种表示方法为原码表示法。
若 x =± x 1 x 2 … x n -1 ,则[ x ] 原 =± x 0 x 1 x 2 … x n -1 。其中, x 0 为原机器数的符号位,它满足:
3.反码
如果[ x ] 原 =0 x 1 x 2 … x n -1 ,则[ x ] 反 =[ x ] 原 。
如果[ x ] 原 =1 x 1 x 2 … x n -1 ,则 。
也就是说,正数的反码与其原码相同,而负数的反码是保持原码的符号位不变,各数值位按位取反。
4.补码
1)补码的引进
首先以日常生活中经常遇到的钟表对时为例来说明补码的概念,假定现在是北京时间8点整,而一只表却指向10点整。为了校正此表,可以采用倒拨和顺拨两种方法:倒拨就是逆时针减少2小时,把倒拨视为减法,相当于10-2=8,时针指向8;顺拨就是将时针顺时针拨10小时,时针同样指向8,把顺拨视为加法,相当于10+10=12(自动丢失)+8=8,其中自动丢失的数(12)就称为模(mod),上述加法称为“按模12的加法”,用数学式可表示为
10+10=12+8=8(mod12)
因时针转一圈会自动丢失一个数12,故10-2与10+10是等价的,称10和-2对模12互补,10是-2对模12的补码。引进补码概念后,就可以将原来的减法10-2=8转化为加法10+10=12(自动丢失)+8=8(mod12)了。
2)补码的定义
通过上面的例子不难理解计算机中负数的补码表示法。设寄存器(或存储单元)的位数为 n ,则它能表示的无符号数最大值为2 n -l,逢2 n 进1(2 n 自动丢失)。换句话说,在字长为 n 的计算机中,数2 n 和0的表示形式一样。若机器中的数以补码表示,则数的补码以2 n 为模,即
[ x ] 补 =2 n + x (mod2 n )
若 x 为正数,则[ x ] 补 = x ;若 x 为负数,则[ x ] 补 =2 n + x =2 n -| x |,即负数 x 的补码等于2 n (模)加上其真值或减去其真值的绝对值。
在补码表示法中,0只有一种表示形式,即0000…0。
3)求补码的方法
根据上述介绍可知,正数的补码等于原码。下面介绍求负数补码的3种方法。
(1)根据真值求补码。
根据真值求补码就是根据定义求补码,即
[ x ] 补 =2 n + x =2 n -| x |
负数的补码等于2 n (模)加上其真值,或者等于2 n (模)减去其真值的绝对值。
(2)根据反码求补码(推荐使用方法)。
[ x ] 补 =[ x ] 反 +1
(3)根据原码求补码。
负数的补码等于其反码加l,这也可以理解为负数的补码等于其原码各位(除符号位外)取反并在最低位加1。如果反码的最低位是1,则它加1后就变成0,并产生向次低位的进位。如果反码的次低位也为l,则它同样变成0,并产生向其高位的进位(这相当于在传递进位)。以此类推,进位一直传递到第1个为0的位为止,于是得到这样的转换规律:从反码的最低位起直到第一个为0的位之前(包括第一个为0的位),一定是1变0,第一个为0的位以后的位都保持不变。由于反码是由原码求得的,所以可得从原码求补码的规律为:从原码的最低位开始到第1个为1的位之间(包括此位)的各位均不变,此后各位取反,但符号位保持不变。
特别要指出的是,在计算机中凡是带符号的数一律用补码表示且符号位参加运算,其运算结果也用补码表示,若结果的符号位为“0”,则表示结果为正数,此时可以认为该结果是以原码形式表示的(正数的补码即原码);若结果的符号位为“l”,则表示结果为负数,此时可以认为该结果是以补码形式表示的,若用原码来表示该结果,还需要对结果求补(除符号位外“取反加l”),即
[[ x ] 补 ] 补 =[ x ] 原
由于微型计算机不但要处理数值计算问题,还要处理大量非数值计算问题,因此除非直接给出二进制数,否则不论是十进制数还是英文字母、汉字及某些专用符号,都必须编成二进制代码才能被计算机识别、接收、存储、传送及处理。
1.十进制数的编码
在微型计算机中,十进制数除了可以转换成二进制数,还可以用二进制数对其进行编码:用4位二进制数表示1位十进制数,使它既具有二进制数的形式又具有十进制数的特点。二-十进制码又称为BCD码(Binary-Coded Decimal),它有8421码、5421码、2421码、余3码等编码,其中最常用的是8421码。8421码与十进制数的对应关系如表1.2所示,每位二进制数位都有固定的权,各数位的权从左到右分别为2 3 、2 2 、2 1 、2 0 ,即8、4、2、1,这与自然二进制数的位权完全相同,故8421码又称为自然权BCD码。其中,1010~1111这6个编码属于非法8421码,是不允许出现的。
表1.2 8421码与十进制数的对应关系
由于BCD码低位与高位之间是“逢十进一”,而4位二进制数(十六进制数)低位与高位之间是“逢十六进一”,因此在用二进制加法器进行BCD码运算时,如果BCD码运算的低位、高位的和都在0~9范围内,则其加法运算规则与二进制加法运算规则完全一样;如果相加后某位(BCD码位,低4位或高4位)的和大于9或产生了进位,则此位应进行“加6调整”。在微型计算机中,通常设置了BCD码的调整电路,每执行一条十进制调整指令,就会自动根据二进制加法结果进行修正。由于BCD码低位向高位借位是“借一当十”,而4位二进制数(十六进制数)是“借一当十六”,因此在进行BCD码减法运算时,如果某位(BCD码位)有借位,那么必须在该位进行“减6调整”。
2.字符编码
拓展阅读
由于微型计算机需要进行非数值处理(如指令、数据、文字的输入及处理等),因此必须对英文字母、汉字及某些专用符号进行编码。微型计算机系统的字符编码多采用美国信息交换标准代码—ASCII码(American Standard Code for Information Interchange),ASCII码是7位代码,共有128个字符(拓展阅读),其中有94个字符是图形字符,可通过字符印刷或显示设备打印出来,包括数字10个、英文大小写字母52个,以及其他字符32个;另外34个字符是控制字符,包括传输字符、格式控制字符、设备控制字符、信息分隔符和其他控制字符,这类字符不可打印、不可显示,但其编码可进行存储,在信息交换中起控制作用。其中,数字0~9对应的ASCII码为30H~39H,英文大写字母A~Z对应的ASCII码为41H~5AH,英文小写字母a~z对应的ASCII码为61H~7AH,这些规律对今后码制转换的编程非常有用。
我国于1980年制定了国家标准GB1988—80《信息处理交换用的七位编码字符集》,其中除用人民币符号“¥”代替美元符号“$”外,其余字符与ASCII码的字符相同。