1.2二进制与0、1编码•电子计算机是一种极为复杂的电子机器,但是它的组成元件却是极为简单的电子开关•电子计算机最基本工作是由电子开关实现的。这里电子开关泛指具有“开”和“关”,或者具有“高”电平和“低”电平这样的两种状态的电子器件。•为了叙述的方便,0、1编码通常把这两种状态分别用符号“0”和“1”表示。计算机工作中所需要的一切信息,都是用开关状态的组合表示的,称为“0”和“1”编码。本节主要内容1.2.1数值数据的0、1编码1.2.3字符数据的0、1编码1.2.4图像的0、1编码1.2.5声音的0、1编码1.2.6指令的0、1编码与计算机程序设计语言1.2.7数据传输中的差错检验1.1.1数据的开关表示一只开关只有“开”和“关”两种状态。通常把这两种状态分别用符号“0”和“1”表示。计算机工作中所需要的一切数据信息,都是用开关状态的组合表示的,或称为用“0”和“1”编码表示的。1.数值数据的0、1编码通常人们使用的是十进制计数法。十进制计数法有两个主要特点:·采用0,1,2,3,4,5,6,7,8,9十个符号表示数字;·十进制的位权是10的幂,即10i,10i-1,…,103,102,101,100,10-1,10-2,10-3,…位权即位置本身所具有的数量级别。它使一个表数符号在不同的位置上,所代表的数值不同。与之对应,用电子开关表示数值,只能使用两个符号:0和1,所采用的进位计数法称为二进制。二进制的位权是2的幂,即2i,2i-1,…,23,22,21,20,2-1,2-2,2-3,…表1.1为几个十进制数与二进制数之间的对应关系。显然,与十进制的“逢十进一”相似,二进制也具有“逢二进一”的特征。下面介绍十进制数与二进制数之间的一般转换关系。(1)二—十(B→D)进制转换规则:各位对应的十进制值之和;各位对应的十进制值为系数与其位权之积。例1.1.1101.11101B=?D解:位权:2221202-12-22-32-42-5二进制数:101.11101计算:4+0+1+0.5+0.25+0.125+0+0.03125=5.90625D(2)整数十—二转换规则:连续“(向左)除2取余,直到0”。例1.1.229D=?B解:连续“除2取余”01371429结束11101十进制余数序列即对应的二进制数所以29D=11101B有时,小数十—二转换,会出现转换不完的情况。这时可按“舍0取1”(相当于四舍五入)的原则,取到所需的位数。例1.1.30.375D=?B解:小数部分连续“乘2取整”0.3750.751.501.00结束0.011所以0.375D=0.011B注意:第一个0与小数点要照写。(3)小数十—二进制转换规则:连续“(向右)乘2取整,直到0”。例1.1.40.24D=?B解:连乘0.240.480.961.921.841.681.360.721.44取整0.00111101结果0.0011111舍入(4)整数小数混合十—二进制转换规则:从小数点向左、右,分别按整数、小数规则进行。例1.1.529.375D=?B解:连续“除2取余”连续取小数部分“乘2取整”01371429.3750.751.501.0011101.011所以29.375D=11101.011B2.二进制运算法则(1)加法规则:“逢2进1”0+0=01+0=0+1=11+1=10例1.1.6101.01+110.11=?解:101.01+110.111100.00所以101.01+110.11=1100.00(2)减法规则:“借1当2”0–0=01–0=11–1=010–1=1例1.1.71100.00-110.11=?解:1100.00-110.11101.01所以1100.00-110.11=101.01(3)乘法规则0×0=01×0=0×1=01×1=1显然,二进制数乘法比十进制数乘法比简单多了。例1.1.810.101×101=?解:10.101…………被乘数×101…………乘数10.101000.00………部分积+1010.11101.001…………积所以10.101×101=1101.001在二进数运算过程中,由于乘数的每一位只有两种可能情况,要么是0,要么是1。因此部分积也只有两种情况,要么是被乘数本身,要么是0。根据这一特点,我们可以把二进制数的乘法归结为移位和加法运算。即通过测试乘数的每一位是0还是1,来决定部分积是加被乘数还是加零。除法是乘法的逆运算,可以归结为与乘法相反方向的移位和减法运算。因此,在计算机中,只要具有移位功能的加法/减法运算器,便可以完成四则运算。3.八进制(Octal)、十六进制(Hexadecimal)和二-十进制(1)八进制和十六进制二进制数书写太长,难认、难记。为了给程序员提供速记形式,使用中常用八进制和十六进制作为二进制的助记符形式。八进制记数符:0,1,2,3,4,5,6,7十六进制记数符:0,1,2,3,4,5,6,7,8,9,A(a),B(b),C(c),D(d),E(e),F(f)将二进制数由小数点起,向两侧分别以每3位划一组(最高位与最低位不足3位以0补)。每一组便为一个八进制数。同理以4位为一组,每一组便为一个十六进制数。例1.1.9101101110.1111B=?H解:补零000101101110.111116EF所以101101110.1111B=16E.FH从根本上来说,计算机内部进行的运算,实际上是二进制运算。但是,把十进制数转换为二进制数,并使用二进数计算的结果,转换为十进制数,在许多小型计算机中所花费的时间是很长的。在计算的工作量不大时,数制转换所用时间会远远超过计算所需的时间。在这种情况下,常常采用二-十进制数。(2)二-十进制(BCD)码二-十进制(BCD)码也称为二进制编码形式的十进制数,即用4位二进制数来表示一位十进制数,这种编码形式可以有多种,其中最自然、最简单的一种方式为8-4-2-1码,也称压缩的BCD码。即这4位二进制数的权,从左往右分别为8,4,2,1。例1.1.103579D=?BCD解:3579↓↓↓↓0011010101111001所以3579D=0011010101111001BCD4.机器数在计算机中不仅要用0,1编码的形式表示一个数的数值部分,正、负号也要用0,1编码来表示。一般用数的最高位(最左边一位)(MSB,MostSignificantBit)表示数的正负,如:MSB=0表示正数,如+1011表示为01011;MSB=1表示负数,如-1011表示为11011。一个数在机器内的表示形式称为机器数。它把一个数连同它的符号在机器中被0,1编码化了。这个数本身的值称为该机器数的真值。上边的“01011”和“11011”就是两个机器数。它们的真值分别为+1011和-1011。当然,在不需要考虑数的正、负时,是不需要用一位来表示符号的。这种没有符号位的数,称为无符号数。由于符号位要占用一位,所以用同样字长,无符号数的最大值比有符号数要大一倍。如字长为4位时,能表示的无符号数的最大值为1111,即15,而表示的无符号数的最大值为111,即7。直接用一位用0,1码表示正、负,而数值部分不变,在运算时带来一些新的问题:(1)两个正数相加时,符号位可以同时相加:0+0=0,即和仍然为正数,没有影响运算的正确性。(2)一个正数与一个负数相加,和的符号位不是两符号位直接运算的值:0+1=1,而由两数的大小决定。即和的符号位是由两数中绝对值大的一个数所决定的。(3)两个负数相加时,由于1+1=10,因此和的符号也不是由两符号位直接运算的结果所决定。简单地说,用这样一种直接的形式进行加运算时,负数的符号位不能与其数值部分一道参加运算,而必须利用单独的线路确定和的符号位。这样使计算机的结构变得复杂化了。如何解决机器内负数的符号位参加运算的问题?•例:1110-1011=?如果直接用减法可知?=0011但是,可考虑1110-1011+10000=?+10000,即1110+(10000-1011)=?+10000,可得1110+0101=?+10000,可得10011=?+10000,可得0011=?(1)先看10000-1011=0101(2)再看1011的每一位求反后得到0100,1变0,0变1(3)最后发现(1)中的0101与(2)中的0100相差1•1011的每一位求反得到0100(反码,每一位求反)•1011+0100=1111(原码+反码=所有位为1)•0100+1=0101(补码,在反码的最低位补1)为了解决机器内负数的符号位参加运算的问题,引入了反码和补码两种机器数形式,而把前边的直接形式称为原码。(1)反码对正数来说,其反码和原码的形式是相同的。即[X]原=[X]反对负数来说,反码为其原码的数值部分的各位变反如:X[X]原[X]反+11010110101101-1101→11101→10010取反反码运算要注意3个问题:·反码运算时,其符号位与数值一起参加运算。·反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加。这叫做循环进位。·反码运算有如右性质:[X]反+[Y]反=[X+Y]反。例1.1.11已知:X=0.1101Y=-0.0001求:X+Y=?解:[X]反=0.1101正数的反码与原码相同+[Y]反=1.111010.1011+循环进位1X+Y=0.1100所以X+Y=0.1100例1.1.12已知:X=-0.1101Y=-0.0001求:X+Y=?解:[X]反=1.0010+[Y]反=1.111011.0000+循环进位1X+Y=1.0001所以X+Y=-0.1110(2)补码对正数来说,其补码和原码的形式是相同的:[X]原=[X]补;对负数来说,补码为其反码(数值部分各位变反)的末位补加1。例如X[X]原[X]反[X]补+1101→01101→01101→01101-1101→11101→10010→10011取反补1这种求负数的补码的方法,在逻辑电路中实现起来是很容易的。不论对正数,还是对负数,反码与补码具有下列相似的性质:[[X]反]反=[X]原[[X]补]补=[X]原例1.1.13原码、补码的性质举例:变反[[X]反]反X[X]原变反[X]反加1[X]补变反[[X]补]反加1[[X]补]补+11010110101101011010110101101-11011110110010100111110011101采用补码运算也要注意3个问题·补码运算时,其符号位也要与数值部分一样参加运算。·符号运算后如有进位出现,则把这个进位舍去不要。·反码运算有如右性质:[X]补+[Y]补=[X+Y]补。例1.1.14(整数)已知:X=1101Y=-0010求:X+Y=?解:[X]补=1101+[Y]补=1110[X+Y]补=11011↓舍去不要所以X+Y=1011例(小数)已知:X=0.1101Y=-0.0001求:X+Y=?解:[X]补=0.1101+[Y]补=1.1111[X+Y]补=10.1100↓舍去不要所以X+Y=0.1100例1.1.15已知:X=-0.1101Y=-0.0001求:X+Y=?解:[X]补=1.0011+[Y]补=1.1111[X+Y]补=11.0010↓舍去不要所以X+Y=-0.1110采用反码和补码,就可以基本上解决负数在机器内部数值连同符号位一起参加运算的问题。(3)移码移码是在补码的最高位加1,故又称增码。例1.1.16几个数的4位二进制补码和移码真值补码移码+300111011000001000-310110011显然,补码和移码的数值部分相同,而符号位相反。例1.17几个典型数的原码、反码、补码和移码表示。由表1.2可见,字长为8位时,原码、反码的表数范围为+127~-127,而补码的表数范围为+127~-128。这是因为负数的补码是在其反码上加1的缘故。对于其他字长的原码、反码的表数范围,读者可以举一反三地得到。从表中还看到:·反码有+0与-0之分。·从+128到-128,数字是从