0.2 计算机中的数制与码制
0.2.1 计算机中的数
计算机内部由触发器、计数器、加法器、逻辑门等基本的数字电路构成。数字电路具有两种不同的稳定状态且能相互转换,用“0”和“1”表示最为方便。因此,计算机处理的一切信息包括数据、指令、字符、颜色、语音、图像等均用二进制数表示。但是二进制数书写起来太长,且不便于阅读和记忆,所以微型计算机中的二进制数都采用十六进制数来缩写。十六进制数用0~9、A~F等16个数码表示十进制数0~15。然而人们最熟悉、最常用的是十进制数。为此,要熟练掌握二进制数、十六进制数、十进制数的表示方法及它们相互之间的转换。它们之间的关系如表0-1所示。为了区别十进制数、二进制数及十六进制数,在数的后面加一字母,用B(Binary)表示二进制数;D(Decimal)或不带字母表示十进制数;H(Hexadecimal)表示十六进制数。
表0-1 不同进位记数制对照表
1.二进制数和十六进制数间的相互转换
二进制整数转换为十六进制数,其方法是将二进制数从右(最低位)向左每4位为1组分组,最后一组若不足4位则在其左边添加0,以凑成4位,每组用1位十六进制数表示。如
1111111000111B→1111111000111B→0001111111000111B=1FC7H
十六进制数转换为二进制数,只需用4位二进制数代替1位十六进制数即可。如
3AB9H=0011101010111001B
2.十六进制数和十进制数间的相互转换
十六进制数转换为十进制数十分简单,只需将十六进制数按权展开相加即可。如
1F3DH=163×1+162×15+161×3+160×13
=4096×1+256×15+16×3+1×13
=4096+3840+48+13=7997
十进制整数转换为十六进制数可用除16取余法,即用16不断地去除待转换的十进制数,直至商等于0为止。将所得的各次余数依倒序排列,即可得到所转换的十六进制数。如将38947转换为十六进制数,其方法及算式如下:
即38947=9823H。
3.计算机中数的几个概念
(1)机器数与真值
机器数:机器中数的表示形式。它将数的正、负符号和数值部分一起进行二进制编码,其位数通常为8的整数倍。
真值:机器数所代表的实际数值的正负和大小,是人们习惯表示的数。
有符号数:机器数最高位为符号位,“0”表示“+”(正),“1”表示“-”(负)的数。
无符号数:机器数最高位不作为符号位,而是当做数值的数。
(2)数的单位
位(bit):一个二进制数中的1位,其值不是1,便是0。
字节(Byte):一个字节,就是一个8位的二进制数,是计算机数据的基本单位。
字(Word):两个字节,就是一个16位的二进制数,它需要两个单元存放。
双字:两个字,即4字节,一个32位二进制数,它需要4个单元存放。
因此,只有8位、16位或32位机器数的最高位才是符号位。
0.2.2 计算机中的有符号数的表示
符号数有原码、反码和补码3种表示法。
1.原码
数值用其绝对值,正数的符号位用“0”表示,负数的符号位用“1”表示。如:
8位原码数的范围为FFH~7FH(-127~127)。原码数00H和80H的数值部分相同、符号位相反,它们分别为+0和-0。16位原码数的数值范围为FFFFH~7FFFH(-32767~32767)。原码数0000H和8000H的数值部分相同、符号位相反,它们分别为+0和-0。
原码表示简单易懂,而且与真值的转换方便。但若是两个异号数相加,或两个同号数相减,就要做减法。为了把减运算转换为加运算,简化计算机的结构,就引进了反码和补码。
2.反码
正数的反码与原码相同;负数的反码:符号位不变,数值部分按位取反。
例如,求8位反码机器数:
3.补码
正数的补码与原码相同;负数的补码为其反码加1。
例如,求X1和X2的8位补码:
X1=+4:[X1]原=[X1]反=[X1]补=00000100=04H X2=-4:[X2]原=10000100,[X2]反=11111011,[X2]补=[X2]反+1=11111100=FCH
8位补码数的数值范围为-128~127(80H~7FH),16位补码数的数值范围为8000H~7FFFH(-32768~32767)。字节80H和字8000H的真值分别是-128(-80H)和-32768(-8000H)。补码数80H和8000H的最高位既代表了符号为负,又代表了数值为1。
求补码除了上面的反码加1的方法外,还有以下方法。
①快速求法:将负数原码的最前面的1和最后一个1之间的每一位取反。例如
②两数互补是针对一定的“模”而言的,“模”即计数系统的过量程回零值,如时钟以12为模(12点也称0点),4和8互补;一位十进制数3和7互补(因为3+7=10,个位回零,模为101=10);两位十进制数35和65互补(因为35+65=100,十进制数两位回零,模为102=100);而对于8位二进制数,模为28=100000000B=100H;同理16位二进制数,模为216=10000H。由此得出求补的通用方法:一个数的补数=模-该数。这里补数是对任意数而言的,包括正、负数;而补码是针对符号机器数而言的,因此,求补和求补码是有区别的。下面用[X]补表示X的补码。
设有原码机器数X,则:
例如,对于8位二进制数:
对于16位二进制数:
4.几点说明
①根据两数互为补的原理,对一个补码机器数求补码就可以得到其原码;将原码的符号位变为正、负号,即是它的真值。
例如,求补码数FAH的真值。因为FAH为负数,求补码[FAH]补=86H=-6。又如,求补码数78H的真值。因为78H为正数,求补码[78H]补=78H=+120。
②一个用补码表示的机器数,若最高位为0,则其余几位即为此数的绝对值;若最高位为1,其余几位不是此数的绝对值,必须把该数求补(按位取反(包括符号位)加1),才得到它的绝对值。如X=-15,[-15]补=F1H=11110001B,求补得00001110+1=00001111B=15。
③当数采用补码表示时,就可以把减法转换为加法。
【例0-1】 64-10=64+(-10)=54
结果相同,其真值为36H(=54)。由于数的8位限制,最高位的进位自然丢失,在计算机中,进位被存放在进位标志CY中。用补码表示后,减法均可以用补码相加完成。因此,在计算机中,凡是符号数一律用补码表示,用加法器完成加、减运算,用加法器和移位寄存器完成乘、除运算,以简化计算机结构。
【例0-2】 34-68=34+(-68)=-34
34=22H=00100010B68=44H=01000100B[-68]补=10111100B
结果相同。因为符号位为1,对其求补,得其真值:-00100010B,即为-34(-22H)。
由上面两个例子还可以看出:
①补码运算后的结果为补码,需再次求补才能得到运算结果的真值;
②用补码相加完成两数相减,相减若无借位,化为补码相加就会有进位;相减若有借位,化为补码相加就不会有进位。
0.2.3 进位和溢出
【例0-3】105+50=155
若把结果9BH视为无符号数,为155,结果是正确的。若将此结果视为符号数,其符号位为1,应求其补码得-65H,即-101。两正数相加结果为负,这显然是错误的。其原因是和数155大于8位符号数所能表示的补码数的最大值127,使数值部分占据了符号位的位置,产生了溢出,从而导致结果错误。又如:
两个负数相加,和应为负数,而结果01100101B却为正数,这显然是错误的。其原因是和数-155小于8位符号数所能表示的补码数的最小值-128,也产生了溢出。
结论:当两个补码数相加结果超出补码的表示范围时,就会产生溢出,导致结果错误。
计算机中设立了溢出标志位OV,通过最高位的进位(符号位的进位)CY和次高位进位(低位向符号位的进位)CY-1异或产生。
【例0-4】 74+74=4AH+4AH
例0-3中 OV=1,CY=1,例0-4中OV=1,CY=0,由此可见,溢出和进位并非有必然的联系,这是由于两者产生的原因不同,两者判断的方法也不同,重述如下。
溢出OV:当两个补码数相加结果超出补码表示范围就会产生溢出,OV=CYCY-1;
进位CY:当运算结果超出计算机位数的限制(8位、16位),会产生进位,它是由最高位运算产生的,在加法中表现为进位,在减法中表现为借位。
0.2.4 BCD码
生活中人们习惯使用十进制数,计算机只能识别二进制数,为了将十进制数变为二进制数表示,出现了BCD码(Binary Coded Decimal),即二进制代码表示的十进制数。顾名思义,它既是逢十进一,又是一组二进制代码。用4位二进制数编码表示1位十进制数称为压缩的BCD码,8位二进制数可以表示2个十进制数位。也可以用8位二进制数表示1个十进制数位,这种BCD码称为非压缩的BCD码。十进制数和BCD码的对应关系见表0-2。
表0-2 BCD编码表
【例0-5】 求十进制数876的BCD码。
压缩的BCD码:[876]BCD=100001110110B=876H
非压缩的BCD码:[876]BCD=000010000000011100000110B=080706H
例如,十进制数1994的压缩的BCD码为1994H,1994的非压缩的BCD码为01090904H。
由上例可见,求十进制数的BCD码无须经历每位数先变为二进制数,再变为十六进制数的过程,直接在十进制数后加H即可。这里要注意,BCD码是编码,它和真值是有差别的。
0.2.5 BCD码的运算
BCD码运算应该得到BCD码结果。由于计算机是按二进制数运算的,结果不为BCD码,因此要进行十进制调整。调整方法为:当计算结果有非BCD码或产生进、借位时,加法进行+6、减法进行-6调整运算。
【例0-6】 计算BCD码 78+69=?
【例0-7】 计算BCD码 38-29=?
在计算机中,有专门的调整指令完成调整操作。
0.2.6 ASCII码
表0-3 常用字符的ASCII码
美国标准信息交换码ASCII码(American Standard Code for Information Interchange),用8位二进制编码表示字符,用于计算机与计算机、计算机与外设之间传递信息。每一个符号都有对应的ASCII码,常用数字和字母的ASCII码如表0-3所列。在程序中,字符可用ASCII码表示,也可以用加引号的字符表示,例如字符4,可以用34H表示,也可以用“4”表示,此时,它只有符号的意义,而无数量的概念。