第3章信息表示 从前面的介绍中可知:计算机元器件的基本物理特性使得它们容易产生两种明显不同 的状态(电路的开与关、磁极的南与北、材料表面的凸与凹等), 通常用0和1抽象地表示它 们。那么,世界上纷繁多样的信息是怎样在计算机中用0和1表示出来的呢? 本章就介绍 与此有关的知识。 计算机中只能存储0和1,如果要用它们表示数值,则需要采用二进制。当然,计算机 中表示的信息不一定都是数值。在表示非数值信息时,所谓“进制”的概念是没有意义的,但 人们习惯上还是笼统地说“计算机是用二进制表示信息的”。那么,到底什么是二进制呢? 它和常用的十进制之间有什么关系呢? 针对这些问题,本章将首先介绍进位制的有关内容。 在弄清楚进位制的问题之后,再说明计算机中是怎样用0和1表示信息的。本章主要介绍 数字和各种字符的表示,其他诸如多媒体信息的表示比较复杂,本章不做介绍。本章最后介 绍指令和程序的表示。 3.进位制及其转换 1 采用进位制表示数是人类的一个重要的发明。我们在学算术时都知道一个道理:“ 满 十进一”,即数数的时候数到10 就进一位。这种记数方法称为十进制。我们把记数进位的 规则称为进位制。习惯上用进位制规定的进位的值命名记数方法。例如,“满二进一”的记 数方法就称为二进制,“满八进一”的记数方法就称为八进制。 进位制就好像一种打包方法。假设有一大堆苹果,现在要把它们装到箱子里。首先把 苹果分成10 个一组,装在一个个小箱子里,把它们称为1号箱。如果最后一组不到10 个, 就把它们放在外边。然后,再把1号箱分成10 个一组,每组再装到大一点儿的2号箱里。 同样,如果最后一组不够10 个,就把它们放在外边,不再装入2号箱。这样继续下去,一直 到不存在10 个一样的箱子。最后清点每种箱子以及没有装箱的苹果的个数,并把这些数字 按照箱子从大到小的顺序写在一起。例如,最大的4号箱有6个,没装进4号箱的3号箱有 7个,没装进3号箱的2号箱有0个,没装进2号箱的1号箱有9个,外面还剩3个苹果。这 样就得出一个数字:67093,这个数字正好是这些苹果的个数,准确地说是苹果个数的十进 制表示。因为只要有10 个一样的箱子,就把它装到大一号的箱子中,这就是“满十进一”。 如果你不是按照10 个一组来装箱,而是按照2个一组来装箱,即只要有两个一样的箱 子,就把它装到大一号的箱子中。这样最后从大到小清点箱子形成的数字就是苹果个数的 二进制表示。以此类推,以8为单位装箱就可以得到这个数字的八进制表示。 日常生活中用得较多的记数方法是十进制。有时也会用到其他进制的记数方法。例 如,在计时上,采用的就是六十进位制,60 秒为一分钟,60 分钟为一小时。 下面介绍与计算机有关的几种进位制。 3.1 进位制 1. 1. 十进制 第3章信息表示 十进制是我们最熟悉的进位制。下面通过十进制了解与进位制有关的属性,仍然使用 苹果装箱的例子。使用十进制,也就是说把苹果按照10 个一组进行装箱。如果最后一组苹 果不够装满一箱,那这几个苹果就不装箱。那么剩下的苹果数可能是1~9的任何一种情况 或者一个不剩(为0)。为了表示没有装到1号箱中的苹果个数,一共需要10 个符号区分从 “没有”到“九”这10 种不同的情况。用0~9这10 个阿拉伯数字完成这个任务,这10 个阿 拉伯数字称为十进制的数码。每个进位制的数码的个数称为该进位制的基数。例如,十进 那么十进制的基数就是10 。十进制用英文字母D表示,它是英 示................................ 制有0~ 9一共10 个数码, 文单词decimal的首字母。 .................................. .. .... .. 重点提 记数进位的规则称为进位制。 习惯上用进位制规定的进位的值命名记数方法。 每个进位制使用的数码个数称为该进位制的基数。 ............ .................................................................................... 假定按照10 个一组为单位进行苹果装箱,最后清点得出的数字是6789 。也就是说最 后我们看到6个3号箱、7个2号箱、8个1号箱以及9个苹果。这也就意味着苹果的个数 因为每个1号箱中可以装10 个苹果;每个2号箱中有10 个1号箱,所 .......... 是6789 。为什么呢? 以每个2号箱中有10×10 个苹果;每个3号箱中有10×10×10 个苹果。所以一共有 6×103+7×102+8×101+9=6789 个苹果。把6789 这个数右起第一位记作位置1,第二位记作位置2…… 第 n 位记作位置n。 可以看出,6789 这个数的每个位置和一个特殊的常数有关。例如,位置4对应103,位置2 对应101…… 位置 n 对应10n-1。这个常数称为该位置的位权。例如,4号位置的位权是 不同箱子的个数在数字中的位置是固定的。例如,3号箱的个数出 现在位置4。其实每位上的位权就是对应箱子中苹果的个数。例如,4号位置的位权就是3 3。通常位权用十进制数表示。位权是和数字的进位制有关系的。现 103。按照上面的记法, 号箱中的苹果个数10 在4号位置的位权为103 是因为采用的是十进制。也就是说,苹果是按照10 个一组装箱 的,所以3号箱中的苹果数是103。如果苹果是按照2个一组装箱的,那么3号箱中苹果的 这是因为采用的是二进制记数法。 个数应该是23,此时4号位的位权应该是23, 概括一下,用 q 进制表示的数,第 n 位( 最右边一位为第1位)上的位权是qn-1。例如, 十六进制数的第2位上的位权为16 。 接下来讨论小数的问题。看下面的例子: 二进制数的第3位上的位权为22, 0.=-1+2×10-2+3×10-3+4×10-4 12341×10 因此,规定小数点右边第一位的位权为10 1,第二位为10-2,以此类推。 现在把整数和小数的情况归纳在一起: 对于用 q 进制表示的数,其数码的顺序定义如下:小数点左边第一位定义为第1位,向 左第二位定义为第2位,以此类推;小数点右边第一位定义为第0位,右边第二位定义为第 1。 -1位,以此类推, 那么,第 n 位上的位权就是qn 75 -3,十六进制数小数点后第2位上的位权 用十进制表示)应该是经过下列运 然后再把这些乘积累加。例如, 例如,二进制数小数点后第3位上的位权为2 为16-2。 从上面的分析可以看出,每个数字表示的实际数值( 算得出的值:把每个位置上的数码乘以该位置上的位权, 6789=6×103+7×10 因为现在用到的数字6789 和它所表示的数值6789 都是十进制表示,所以当然一样了。如 果不是十进制,这个数看起来就会不一样了。 .......... .................................. .. .... .. ................................ .................................................................................... 对于用q进制表示的数,其数码的顺序定义如下:小数点左边第一位定义为第1位,向左第二位 定义为第2位,以此类推;小数点右边第一位定义为第0位,右边第二位定义为第- 么,第n位上的位权是qn-1。 ............ 重点提 2.二进制 二进制就是“满二进一”。用苹果装箱的例子说,就是按照2个一组进行装箱。装到最 后,未装箱的苹果和每种箱子最多只有一个, 基数为2。 现在假定只有2个苹果,那么我们可以把它们装入一个1号箱中。清点箱子和未装箱 的苹果的个数,并按照箱子大小顺序写出来就是10 。最后一位应该是未装箱的苹果,如果 没剩,应该用0表示。所以,十进制的数210 用二进制表示就是102( 制数作为下标,指出这个数的进位制) 。也可以用符号B(y)表示二进制数,如10B 。 那么310 用二进制怎么表示呢? 现在重新清点箱子和苹果的个数:1个1号箱和1个没 装箱的苹果,得出数字11 。也就是说310 的二进制表示是112 现在假定按照2个一组把苹果装箱, 个苹果呢(用十进制表示)? 按照装箱和清点规则,10112 这个数字表示最后看到1个3号箱、 箱和1个苹果。按照2个一组装箱,现在每个1号箱中应该有2个苹果;每个2号箱中有2 个1号箱,有2×2 个苹果;每个3号箱中有2个2号箱,有2×2×2 个苹果。所以苹果的个 数为 1×23+0×2 其实可以换一种说法,前面已经得出这个结论:每个数字表示的数值(用十进制表示) 应该是每个位置上的数码乘以该位置上的位权再求和得出的值。 因为10112 是二进制数,即按照2个一组进行苹果装箱,则二进制数第4位上的位权就 应该是3号箱子中的苹果数23,第n位上的位权应该是n-1号箱子中的苹果数2 么二进制数10112 表示的数值(用十进制表示)应该是 10112=1×23+0×2 可以得到同样的结果。 3.八进制 八进制,顾名思义,就是“满八进一”。为什么要讲八进制呢? 说到的十六进制与二进制有很方便的转换关系,所以在计算机领域这两种进位制的使用非 2+8×101+9=6789 示 1位,以此类推,那 只需要0和1两个数码就够了,因此二进制的 数字的后面用一个十进 Binar 。 最后清点得出的数字是10112 。那么,一共有多少 0个2号箱、1个1号 2+1×21+1×20=11 n-1。那 2+1×21+1×20=1110 因为八进制和后面马上要 76 第3章信息表示 常广泛。 计算机里面存储的是二进制数,但是因为二进制数每位只能表示两个数值,所以要表示 一个较大的数就会用很多位。这在计算机中问题不大,但是书写起来就很不方便。例如, 678910 写成二进制数就是1101010000101。所以,尽管计算机实际上用的是二进制,但人们 书写时通常将它们“浓缩”成八进制或十六(2) 进制。 八进制通常用字母O(Octal)表示。八进制需要8个数码符号,它们就是0~7。八进制 数中肯定不会出现数码8。678910 写成八进制数应该是15205。因为八进制也就是按照8 个一组进行苹果装箱,所以八进制数中位置 n 的位权为8n-1。八(8) 进制数152058 表示的十进 制数值可以用下面这个式子计算: 152058=1×84+5×83+2×82+0×81+5×80 结果是678910 。 4. 十六进制 十六进制也就是“逢十六进一”,那么就需要16 个不同的符号。人们用0~9这10 个阿 拉伯数字再加上字母A~F 表示0~15 这16 个数值。678910 写成十六进制数就是1A8516 。 十六进制也就是按照16 个一组进行苹果装箱,所以十六进制数中位置 n 的位权为16n-1。 1A8516 表示的十进制数值就是1×163+10×162+8×161+5×160。通常用H (Hexadecimal)表示十六进制。 3.2 数的进位制转换 1. 有时候需要查看计算机存储器的内容,尤其是寄存器的内容。例如,程序出错时,有些 调试软件会显示相关寄存器的内容。不过这些内容不是以十进制的形式表示的,而是二进 制。说得更精确一些,多数软件会以十六进制的形式(二进制的紧凑方式)显示寄存器的内 容。如果想了解寄存器中的数值到底是多少,就要掌握把这些数转换成十进制表示的方法。 有时候用户还要知道一个数在计算机中应该以什么样的一个0/1串表示,那么就需要把它 转换成二进制表示。所以,要掌握数的不同进制表示之间转换的方法。需要注意的是,这里 讨论的只是同一个数的不同表示方法,所谓转换,并不是将一个数变成了另一个数。 1. 转换成十进制表示 把二进制、八进制和十六进制数转换成十进制表示非常简单,只要把数的每位上的数码 乘以该位上的位权,然后把这些乘积加在一起即可。下面通过实例分别看看这几种进制表 示的转换。 1)二进制数转换成十进制表示 例如,将二进制数111111112 和0.2 转换成十进制表示。因为二进制数第 n 位上 的位权为2n-1,所以, 1101111111112=1×27+1×26+1×25+1×24+1×23+1×22+1×21+1×20=25510 011011×21+1×22+0×23+1×24=0.10 2=81252)八(.) 进制数转换成十进制表示 例如,将八进制数3778 和0.8 转换成十进制表示。因为八进制数第 n 位上的位权 为8n-1,所以, 3773778=3×82+7×81+7×80=25510 77 498046875 -2+7×8-3=0.10 0.3778=3×8-1+7×83)十六进制数转换成十进制表示 例如,将十六进制数FF16 和F.F16 转换成十进制表示。因为十六进制数第n位上的位 权为16n-1,所以, FF16=15×16+15×160F.F16=15×16 清楚了这几种进位制的数到十进制数的转换,接下来看看这些不同进位制的数转换成 二进制表示应该怎样做。 ........ .................................. .. .... .. ................................ .................................................................................... 把二进制、八进制和十六进制的数转换成十进制表示,只需把数的每位上的数码乘以该位上的位 权,然后把这些乘积相加即可。 .......... 重点提 2.转换成二进制表示 1)十进制数转换成二进制表示 还是用苹果装箱的例子说明。假设有89 个苹果,现在要把这些苹果装箱。要得出二进 制表示,所以装箱单位是2,也就是“满二进一” 数按顺序放在一起形成的数就是89 对应的二进制表示。 现在转换问题就变成求各种箱子个数的问题。可以有两种算法:一种是从计算最大箱 子的个数开始,然后再依次算小一号的箱子的个数; 个数开始,一直算到最大号的箱子。两种算法得出的结果应该一样。 先说第一种算法。 这种算法首先要判断最大的箱子是几号。我们已经知道,在以2为单位装箱的情况下, n号箱中苹果的个数是2n。要判断出使用的最大号箱子,就是要看看刚好比89 小一点儿的 2的幂是多少。因为26<8910<27,所以最大的箱子应该是6号箱。装满一个6号箱之后, 还剩89-26=25 个苹果。接下来要看看剩下的这些苹果能装满的最大箱是几号。因为 24<25<25,所以接下来用到的应该是4号箱。现在还剩25 个苹果找最大的箱子,以此类推。最后得到的结果是:1个6号箱, 还有一个苹果未装箱。按顺序把这些数放在一起, 的数字串是1011001 。这个数字串就是89 的二进制表示。 这种算法被称为减权定位法。其过程是:将要转换的十进制数和相近的权值比较,从 中减去比该数小的最大权值,并确定与该权值对应的数位上的数码为1。以此类推, 数是0为止,未被记1的数位均记为0,即可得到相应的二进制数。 使用减权定位法需要记住每位上的权值。相较于此,第二种算法更容易一些。这种算 法就是从小号箱的个数算起。首先要算这些苹果能够装满多少个1号箱,剩下多少苹果。 剩下的苹果数就是二进制数的最后一位。因为每个1号箱中能装两个苹果,89 除以2等于 44 余1,所以要用到44 个1号箱,剩下1个苹果。因为44/2= 22 个2号箱中,一个没剩,因此最后能看到的1号箱的个数是0。继续将2号箱装入3号 箱,因为22/2=11,所以这些2号箱正好装入11 个3号箱中, =25510 0+15×16-1=15.10 9375 示 。这样,最后各种箱子和未装箱的苹果的个 另一种则反过来,先从计算最小箱子的 -24=9个苹果。继续为这9 1个4号箱,1个3号箱, 中间没有用到的箱子用0表示,最后得到 直到余 22,所以这些1号箱正好装入 一个没剩,因此最后能看到的 78 第3章信息表示 2号箱的个数是0。以此类推,直到剩余的箱子不够再装入大一号的箱子。最后清点箱子和 未装箱的苹果的个数,把这些数按顺序形成一个数字串,这个数字串就是89 的二进制表示。 当然,结果肯定与第一种算法相同。 这种算法其实就是反复地把十进制数除以2,直到商为0,最后形成的二进制数就是从 最后一次除法到第一次除法的余数排列起来。这种算法被称为除基取余法(“基”就是进位 制的基数,二进制的基就是2), 先得到的余数为低位,后得到的余数为高位。 一般采用下面的竖式表示上面的过程 。 例如,求89 的二进制表示 : 则8910=p7p6p5p4p3p2p1=1011001 小数的转换也有两种方法。一种是减权定位法,与前面整数的(2) 情况一样。另一种方法 略有不同,小数的转换不再采用除法,而是采用乘法,称为乘基取整法。具体的做法是:乘 以基数并取整,先得到的整数为高位,后得到的整数为低位。也就是小数部分不断地乘以 2,直到乘积的小数部分为0,然后把每次乘积的整数部分按照先后顺序排列在一起。 例如,求0. 8125 的二进制表示: 则0.812510=p1p2p3p4=0.2 1101 如果要转换的十进制数既有整数部分又有小数部分,那么要将这两部分分开,分别用除 基取余法和乘基取整法求得转换后的整数部分和小数部分,最后再把它们合在一起。 2)八进制数转换成二进制表示 八进制数和十六进制数转换成二进制数则比较简单。因为23=8,所以3位二进制数 正好等于一位八进制数。以下是八进制的8个数码对应的二进制数码: 01234567 000001010111100101110111 79 1111101012 把八进制数转换成二进制数时,直接把这些数码对换成相应的三位二进制数码就可以 了。例如: 7658= 0.76583)十六进制数转换成二进制表示 因为24=16,所以一位十六进制数正好等于4位二进制数,它们的关系也是一一对应 的。16 个十六进制数码对应的二进制数码如下: 0 1 2 0000 0001 0010 0011 0100 0101 0110 0111 8 9 A 1000 1001 1010 1011 1100 1101 1110 1111 把十六进制数转换成二进制数非常简单,只要把每位上的十六进制数码替换成4位二 进制数码即可。例如: A13F16= 0.A13F16=0. 当然和八进制数转换成二进制数一样,这需要熟记这些数码的对应关系。因为十六进 制数和二进制数有这样简单的对应关系, 写,所以平时都用十六进制数描述计算机中的二进制数。例如,需要显示计算机中寄存器的 内容时,通常都以十六进制表示。 .......... .................................. .. .... .. ................................ .................................................................................... 十进制数转换成二进制表示有减权定位法和除基取余法。 八进制数转换成二进制表示,只要把每位上的八进制数码替换成相应的3位二进制数码即可。 十六进制数转换成二进制表示,只要把每位上的十六进制数码替换成相应的4位二进制数码即可。 ............ 重点提 3.转换成八进制表示 有了前面的铺垫,现在你对到八进制数的转换已经能够举一反三了吧? 1)十进制数转换成八进制表示 十进制数转换成八进制表示用除基取余法,只不过现在的基数是8。 例如,求89 的八进制表示: 所以8910= 请你把这个八进制数转换成二进制表示,看看与前面直接从89 转换成的二进制数是否 相同。 2)二进制数转换成八进制表示 把二进制数从最后一位开始分成3位一组,然后替换成相应的八进制数码就可以了。 111110101 =0.2 34567 BCDEF 10100001001111112 10100001001111112 而且十六进制数比较简短,比二进制数更容易读 示 p3p2p1=1318 80 例如,求10100001001111112 的八进制表示, 10100001001111112= 第3章信息表示 转换如下: 10100001001111112=1204778 最后的一组如果不够3位,则要补0。例 转换如下: 1010000100111111002=0.5023748 .............. ................................ .................................................................................... 把二进制整数从最后一位开始向前分成3位一组,然后把每组替换 二进制小数则从小数点后第一位开始向后分成3位一组,如果最后一组不足3位,则用0补齐,然 后把每组替换成相应的八进制数码即可。 .............. 示 最简单的办法是把它先转换成二进制表示,然后再转换 10100001001111112=1204778 1010000100111111002=0.5023748 十进制数转换成十六进制表示采用除基取余法,基数为16 。例如,求8910 的十六进制 表示: 所以8910=p2p1=5916 ........ ................................ .................................................................................... 可以采用减权定位法或者除基取余法(小数部 分采用乘基取整法) 。 .......... 示 将二进制数转换成十六进制表示时,把二进制整数从最后一位开始分成4位一组,然后 把每组替换成相应的十六进制数码就可以了。例如,求10100001001111112 的十六进制表 10100001001111112=A13F16 二进制小数则从小数点后第一位开始分成4位一组,如果最后一组不足4位,则用0补 齐,然后把每组替换成相应的十六进制数码。例如,求0.10100001001111112 的十六进制表 示,转换如下: 10100001001111112=0.A13F16 对于小数,要从小数点后开始分成3位一组, 如,求0.2 的八进制表示, 1010000100111111 0.2=0. 1010000100111111 .................................. .. .... .. 重点 二进制数转换成八进制表示, 成相应的八进制数码即可。 3)十六进制数转换成八进制表示 十六进制数转换成八进制表示, 成八进制表示。例如,求A13F16 的八进制表示: A13F16=10100001001111112= 求0.16 的八进制表示: A13F 0.16=0.2=0. A13F1010000100111111 4. 转换成十六进制表示 1)十进制数转换成十六进制表示 .................................. .. .... .. 重点 把十进制数转换成二进制、八进制和十六进制表示, 2)二进制数转换成十六进制表示 示,转换如下: 10100001001111112= 0.2=0. 1010000100111111 81 然后把每组替 .............. .................................. .. .... .. ................................ .................................................................................... 二进制数转换成十六进制表示,把二进制整数从最后一位开始向前分成4位一组, 换成相应的十六进制数码即可。 二进制小数转换成十六进制表示,则从小数点后第一位开始向后分成4位一组, 足4位,则用0补齐,然后把每组替换成相应的十六进制数码即可。 .............. 重点提示 3)八进制数转换成十六进制表示 将八进制数转换成十六进制表示时, 表示。例如,求1204778 的十六进制表示: 1204778=1010000100111111 ........ .................................. .. .... .. ................................ .................................................................................... 十六进制数转换成八进制表示,把它先转换成二进制表示,然后再转换成八进制表示。 八进制数转换成十六进制表示,把它先转换成二进制表示,然后再转换成十六进制表示。 .......... 重点提示 3.1.3二进制数的运算 进入计算机的世界后,我们将频繁地接触二进制数。下面简要介绍二进制数的运算 规则。二 进制数主要涉及的运算有两类:算术运算和逻辑运算。算术运算主要包括加、减、 乘、除,而逻辑运算主要包括逻辑与、逻辑或、逻辑非以及逻辑异或。 1.算术运算 1)加法运算 二进制数的加法运算和十进制数的加法运算类似, 如,计算11012+10112: 因此01012)减法运算 二进制数的减法运算也同样与十进制数的减法运算类似, 二”。例如,计算11012-10112 因此11013)乘法运算 二进制数的乘法运算的法则也和十进制数相同, 后把这些结果累加。例如,计算11012×10112: 如果最后一组不 把它先转换成二进制表示,然后再转换成十六进制 2=10100001001111112=A13F16 只是进位时要记住“满二进一”。例 2+10112=110002 只是从上一位借位时“借一当 2+10112=102 即分别用乘数的每一位去乘被乘数,然 82 第3章信息表示 100011112 二进制数的除法运算法则也和十进制数相同,由减法、逐位上商等操作分步完成。例 2=10112 ........ ................................ .................................................................................... 二进制数算术运算的法则和十进制数相同,只是“满二进一”和“借一当二”。 .......... 示 逻辑运算是十进制数中没有的。常见的逻辑运算有逻辑与、逻辑或、逻辑非以及逻辑异 或。其实逻辑运算中二进制数的0和1不再是数值的含义,而是分别代表真和假两个值,1 代表真,而0代表假。所以实际上逻辑运算是在真值和假值上的运算。在信息技术应用数 学中还会涉及这些逻辑运算。对于两位以上的二进制数来说,逻辑运算是在每个操作数对 应的位之间进行的,所以也称为按位与、按位或等。下面通过具体的示例介绍逻辑运算 规则。 1)逻辑与 逻辑与的运算符号为∧或者&。它的运算规则如下: 1&1=1,1&0=0,0&1=0,0&0=0 即,只有两个参与逻辑与运算的数都是1时运算结果是1,其余情况结果都为0。其实逻辑 与有“和”“并且”的意思。如果1代表真,0代表假,那么对于事情A、B,要“A并且B”为真 所以11012×10112= 4)除法运算 如,计算100011112/11012: 所以100011112/1101 .................................. .. .... .. 重点提 二进制数主要的算术运算有加、减、乘、除。 2. 逻辑运算 时,显然必须A是真的并且B也是真的才行。 例如,求1101&1011: 83 =1001 因此1101&10112)逻辑或 逻辑或的运算符号为∨或者|。它的运算规则如下: 1|1=1,1|0=1,0|1=1,0|0 即1和任何数进行逻辑或运算结果都为1, 于事情A,B,如果要“A或者B”为真,那么只要A和B中至少有一个是真的就行了。 例如,求1101|1011: 因此1101|10113)逻辑非 逻辑非是单值运算,也就是只对一个数进行操作。它的运算符号是 面画一条横线。它的运算规则如下: ~1=0, ~0=1 也就是逐位取反。例如: ~1101=0010 4)逻辑异或 逻辑异或的运算符号是..。它的运算规则如下: 1..1=0,1..0= 可以看出,逻辑异或的意思就是看看两个操作数是否不一样。如果不一样, 结果为0。 例如,计算1101..1011: 因此1101..1011 ...... .................................. .. .... .. ................................ .................................................................................... 二进制数主要的逻辑运算有逻辑与、逻辑或、逻辑非以及逻辑异或。 ........ 重点提 3.2数字的编码 我们现在已经知道两个事实:一是计算机中存储的是0/1串;二是我们向计算机中存 储的是程序和数据。程序是用某种计算机程序设计语言编写的,具体体现形式就是一个字 符串,包括数字、字母、汉字、运算符以及一些特别规定的符号等。而数据则包括用来运算的 数以及用户的一些文档,如最近新写的一首小诗。那么, 串有什么关系呢? 它们是怎样互相转换的呢? 这就是编码问题。 =0 其余情况结果为0。逻辑或有“或者”的意思。对 =1111 ~或者在数字的上 1,0..1= 1,0..0=0 结果为1;否则, =0110 示 这些日常使用的数字、字母等与0/1 84 第3章 信息表示 85 下面就来说说数字、字母以及汉字在计算机中是怎样表示的。先从数字说起。 3.2.1 原码 从3.1节的介绍可知,数的表示比较简单。你现在一定在想:把各种数字转换成二进 制表示就行了。你说的没错。不过还有一个小问题。我们平时用的数是分正负的。如果是 负数,前面的负号怎么表示呢? 你肯定会说,在转换后的二进制数前单独加一位表示符号就 行了。如果是负数,符号位就为1;如果是正数,符号位就为0。这确实是一种办法。这种数 据表示法被称为原码。 一般情况下,计算机中的数都是要参与运算的。最常见的运算就是加、减。现在看一看 用原码表示的数在计算机中进行加法运算时的步骤。假设要计算57和-68的和。 先把它们转换成二进制表示: 5710 =1110012 6810 =10001002 接下来要做的事情就是加上符号位。现在出现了一个小麻烦。如果直接在10001002 前面加上一个1表示负号,变成11000100,那么怎样才能区分它表示负的10001002 还是正 的110001002 呢? 为此,需要把符号位的位置固定下来,例如,在从最右边开始向左数的第 8位(从1开始计数)作为符号位,则 5710 =1110012,[5710]原=00111001 6810 =10001002,[-6810]原=11000100 这意味着后面有7位可以用来表示数值。前面已经讲过,地址总线的宽度决定最大能访问 的地址。同样道理,如果已经决定用8位表示数,并且1位作为符号位,余下7位表示数的 绝对值,那么可以表示的数的范围就固定了。就目前这种假设情况而言,能表示的数的范围 是什么? 具体地说,如果把原码的长度确定为n 位,则数x 的原码定义如下: [x]原= x, 0≤x <2n-1 2n-1 -x, -2n-1 <x ≤0 { 注意,0的原码有两个。 现在要通过57和-68这两个数的原码00111001和11000100计算它们的和,并且把和 保存在计算机中,也就是说结果也要转换成原码的形式。两个带符号数的加法步骤如下: 首先判断两个加数的符号位; 如果符号位相同 则将两个数相加,和的符号位与加数相同; 否则(如果符号位不同) 比较两个数绝对值的大小; 用绝对值大的数减去绝对值小的数,得出结果的绝对值; 结果的符号位与绝对值大的加数相同。 本例求和步骤如下: (1)通过57和-68的原码判断它们的符号位是否相同。可以看到57和-68的原码 符号位分别为0和1,不相同。 (2)比较这两个数的绝对值的大小,也就是原码的数值部分。可以发现1000100 大于 0111001,所以用1000100 减去0111001,结果为0001011 。 (3)确定结果的符号位,它应该与绝对值大的数( 1。所以 [-6810]原+[5710]原=10001011=[-1110]原 可以发现,对于这个求和过程,最后运算过程是加法还是减法取决于具体加数的情况。所 以,为了实现原码表示数的加法,计算机中需要有能够判断符号位的硬件逻辑,还需要有能 计算加法的逻辑电路,以及能够计算减法的逻辑电路。这样的硬件设计有点儿复杂。如果 不用考虑符号位,并且也不用判断两个数的大小,只要把计算机中两个数的编码直接相加, 就能得出正确结果,那该多好! 这个目标是通过补码实现的。 最后还要说一点,原码除了与数的真值有简单的对应关系, 有一个优点,就是乘除法的运算规则简单。等学习完后面几种数字的编码,读者可以自己想 想怎样实现这些编码的乘除法,然后看看是不是这样。 .............. .................................. .. .... .. ................................ .................................................................................... 原码表示法直接用数字绝对值对应的二进制数表示, 正号。数 的原码同其真值有简单的对应关系,比较容易相互转换。 原码实现加减法很不方便,但实现乘除法的运算规则简单。 .............. 重点提 3.2.2补码 前面讨论原码时,假设计算机用8位表示一个数。这种情况下,可以出现的不同0/1串 范围为00000000~11111111,一共有256 种。对于原码表示法, 以表示的正数为00000000~01111111, 0000~11111111,即0~-127 。所以8位原码可以表示的整数范围为- 255 个整数(数字0占用了两个码:10000000 和00000000 ) 。 现在讨论3.2.1节的目标,找到一个数字编码形式,它在进行加法运算时不用考虑符号 位,也不用判断两个数的大小,只要把计算机中两个数的编码直接相加,就能得出和的相应 编码结果。 现在设计这种编码。还是假定用8位表示整数。我们已经知道,8位一共可以表示256 个不同数。如果全用来表示正数,则可以表示0~ 只占用一个0/1串,由此确定新的编码所表示的数的范围为-12801111111 这128 个0/1串表示和它们的二进制数值相同的数0128 个正数的0/1串,即10000000~11111111,则用来表示- 128 对应的二进制串10000000 表示-128,用129 对应的二进制串10000001 表示-127, 以此类推,用255 对应的二进制串10000010 表示-1 。从中可以发现一个规律:128= -128+256,129=-127+256,…,255=-1+256 。我们把这两个数的关系称为模256 的 补数。现在假设用这种编码,暂时把这种编码称为简单码,因为它的确很简单。现在计算 57 和-68 在这种编码规则下对应的数据表示。 也就是1000100)的符号位相同,即为 比较容易相互转换之外,还 示 并在前面加一位符号位,1表示负号,0表示 第一位是符号位,因此可 换算成十进制整数就是0~127;而负数为1000 127~127,一共 255 。现在希望用它表示有符号数, ~127 。仍然用00000000~ 并且0 ~127;而对应128~255 这 1这128 个负数。用 128~ 86 第3章信息表示 因为5710=1110012,所以[5710]简=00111001 。 因为256-68=188,18810=101111002,所以[-6810]简=10111100 。 现在把[5710]简和[-6810]简加在一起: 111101012=24510=256-11=[-1110]简 也就是说[-6810]简+[5710]简=[-1110]简。 这是巧合吗? 再找另外两个数试验一下,计算-68 和-57 的和。 因为256-57=199,19910=110001112 所以[-5710]简=11000111 而[-6810]简=10111100 那么[-6810]简+[-5710]简=10111100+11000111=110000011 因为现在的数据只能有8位,也就是说存储器中只为每个数留了8位的空间,所以,最 前面的进位1没地方放,被丢弃了。结果就是10000011 。 100000112=13110=256-125=[-12510]简 而-68 和-57 的和正好是-125 。看来不是巧合。那么我们就找到了希望的编码:计算两 个有符号数的加法时,只要直接把它们的简单码相加,就可以得出和,而不用考虑加数的 符号。 其实,这样的结果完全是由于前面发现的那个规律,129=-127+256,即[-127]简= 129=256+(-127 )。这里面蕴含着两个概念,就是“模”与“同余”。 模是指一个计量器的容量。例如,日常使用的钟表上面用12 个格表示整点,所以钟表 的模就是12 。可以用钟表表示19 点,可是表盘上的指针指向7点,所以说19 和7是模12 同余的,因为19 和7除以12 的余数都是7,也就是说,在12 个格的表盘上,7点和19 点的 表示是相同的,都是7。 现在再来看同余。假设现在是7点,如果需要把时间调整到3点,有两种办法:可以把 表针向回拨4个格,也可以把表针向前拨8个格。结论是,在只有12 个格的表盘上,7-4= 7+8 。现在可以发现-4和8是有一定关系的。仔细再观察一下可以发现,在表盘上表示8 和-4的其实是同一个格,都是8点,只不过看你从哪个方向数数。从0点开始顺时针数, 那个格就表示8;如果从0开始逆时针数,那个格就表示-4。实际上,-4和8也是模12 同 余的,称-4和8互为补数。这里有两个规律。首先,将负数加上模就可以得出它的正补 数,例如,-4+12=8。其次,与一个负数的加法可以转换成与这个负数补数的加法,例如,7 +(-4)=7+8(mod12 )。为了避免混淆,在算式中加上(mod12)表示以12 为模。 现在就清楚为什么前面的编码能把同负数的加法直接转换成两个数的加法,而不用考 虑符号了。在这种情况下,因为只有8位的存储空间存放整数,所以只能表示256 个数,这 样存放整数的容器的模就是256 。为了把减法转换成加法,要把负数用它的正补数表示,即 -127 用129(=256+(-127)) 表示。然后,当要计算与某个负数的加法,例如25 加上-127 时,则直接把它们的编码表示相加,也就是25+129=154 。因为表示数的范围是-128~ 127,所以会把154 解释成它的负补数,就是-102(=154-256 )。实际上是用补数表示每个 87 88 数(包括正数,因为正数的补数就是它自己),所以这种编码的名称不是简单码,而是补码。 正数的补码就是它本身。负数的补码等于模加上这个负数,实际上就是模减去负数的 绝对值。模是多少呢? 对于8位二进制数是256(=28),对于n 位二进制数就是2n 。 总结一下,如果补码的长度为n 位,那么数x 的补码定义为 [x]补= x, 0≤x <2n-1 2n +x, -2n-1 ≤x <0 { 从定义可以看出,正数的补码比较好求,而负数的补码要做一个减法运算。 例如,求-68的补码: 6810 =10001002 28 10 =1000000002 所以[-6810]补=100000000-01000100=10111100 实际上,通常不用计算这个二进制减法,而是用另一种简单的算法,即把68对应的二进 制数01000100(一定要记住在最前面加0,补全8位)按位取反(即变成10111011),然后在 末位加1(10111011+1=10111100),这样就把减法换算成取反加一这样简单的运算。这 种算法用硬件实现非常简单。 再介绍一种求负数补码的简单办法。首先,把负数的绝对值对应的二进制数求出来,并 在前面补上必要的0,补全位数,例如8位;然后,从后面开始找到第一个1,把它记下来,并 把其后的0也都写下来;最后,把这个1前面的各位取反,即1变0、0变1。以-68为例,假 设这次用16位编码。 第一步,求出68的二进制表示,并补全位数(千万别忘了): 6810=00000000010001002 第二步,找到第一个1,并将其以及后面的0照抄下来。第三位上的1是从右边数第一 个遇到的1,所以将右边的3位(100)保留下来。 第三步,将第三位上的1前面的各位都取反,就得到了补码: [-68]补=1111111110111100 用补码的定义验证一下,看看结果对不对。 补码这种把减法转换成加法的特性可以大大简化计算机硬件的设计。想象一下,如果 用原码,那么设计加法运算的硬件时必须有两套电路,一套算加法,一套算减法,而且在运算 之前还要有一套电路对加数的符号进行比较,然后决定用加法电路还是减法电路,运算的结 果还要根据前面比较的情况确定符号,非常复杂。而使用补码就很简单,只要一套加法电路 就行了,根本不用考虑符号,并且减法都可以转换成加法实现。负数的补码也很好求,取反 加1,在电路上实现也非常简单。所以,补码是目前计算机中使用很广的一种数字表示 方式。 .......... .................................................................................... .................................................................................... 正数的补码就是它的二进制表示。 负数的补码可以通过将其二进制表示按位取反、末位加1的方法获得。 补码实现加减法的规则比较简单。 ............ 重点提示 第3章信息表示 3.3 反码 2. 数的第三种表示法称为反码。它的定义很简单:正数的反码等于正数本身,负数的反 码等于把负数绝对值的二进制表示每位取反。其实这就是求补码的中间步骤,即按位取反 得出的结果。只不过补码多了个加1的步骤。 计算机中很少用反码直接进行运算。 3.4 移码 2. 除了上述几种数字编码外,有时也会用到一种称为移码的表示法。如果移码的长度为 n 位,那么数 x 的移码定义为 [x]移=2n-1+x, -2n-1≤ x <2n-1 为什么叫移码呢? 因为移码是原来的数加上2n-1,在数轴上也就是将数的位置向数轴 的正方向移动2n-1,因此得名。移码和补码有一个很有用的关系:一个数的补码和移码的 符号位正好相反,而其他位则完全相同。例如,采用8位编码,十进制数7的移码是1000 0111,补码是00000111;而-7的移码是01111001,补码是11111001 。 3.5 小数的表示 2. 前面都是在讲整数怎样表示,关键在于解决符号的表示问题。不过,除了整数,很多地 方还要用到小数。小数比整数多了一个小数点,它把数值分成整数部分和小数部分。所以, 要表示小数就要解决小数点的表示问题。 通常有两种办法可以解决这个问题。第一种办法是把小数点固定在某个默认位置,小 数点并不在数的表示中出现。这种方法表示的数被称为定点数。通常小数点的固定位置有 两种情况。一是默认固定在数的最右边。也就是说,这种数只有整数部分,实际上也就是整 数,因此也把这种数称为定点纯整数。二是把小数点固定在符号位之后。那么,这种数也就 只有小数部分,因此也被称为定点纯小数。 定点表示法可以表示数的范围很有限,要么是整数,要么是小数。可是,通常使用的数 这两部分都是有的。要表示这样的数,就应该允许小数点位置变化,也就需要在表示中给出 小数点位置。这就是第二种小数的表示法,称为浮点表示法,意思是小数点可以浮动位置。 这种表示法表示的数称为浮点数。 那么,怎样表示小数点的位置呢? 计算机采纳了科学记数法的方式。小数0. 000001234 用科学记数法表示就是1.-6。 234×10234, 在科学记数法中,乘号前面的小数部分,如1.给出了有效数字;而后面的幂,如 10-6,给出了小数点的位置。计算机中的浮点数也采用这种方式。因此,一个浮点数分为两 部分:一部分称为尾数,就是科学记数法中的有效数字部分, 234; 如1.另一部分称为阶码, 记录的是后面的幂次,如前面的-6。幂10-6中的10 给出的是这个数的基数,即这是一个 十进制数。但是计算机系统并没有记录基数。通常在一个系统中会使用默认的基数,如2 或者8,并不是10 。 浮点数的尾数一般用补码或原码表示,阶码则用补码、原码或移码表示。与科学记数法 不同的是,浮点数的尾数只记录小数部分,省略了科学记数法中的1位整数部分(因为对于 89 二进制数来说,这1位整数部分的值只能是1,所以就可以省略了)。另外,阶码只记录了幂 的次数。计算机中使用的基数有2、8、16等,通常默认的基数是2,而不是科学记数法通常 采用的10 。 前面介绍了这么多种浮点表示可以采用的编码,如原码、补码,数字的各种编码都可以 使用。当然,为了便于软件的移植,最好都用相同的编码。为此,IEEE在1985年给出了 IEEE754标准。这个标准规定,浮点数的基数为2,阶码用移码表示,尾数用原码表示。它 规定了单精度和双精度两个基本格式。单精度格式浮点数为32位,分别是1位符号位、8 位指数位(阶码)、23位有效位(尾数)。 双精度是什么就不介绍了。如果对具体的定义感兴趣,请查阅其他计算机原理方面的 书,你会发现在数的表示上还有好多要仔细考究的地方。 3.字符编码 3 前面介绍了数字在计算机中是怎样表示的。但是程序在计算机中是怎样存储的呢? 程 序一般是由英文字母加上一些符号构成的。因为计算机中只能存储0和1,所以必须为每 个字母和符号规定一个0/1串表示,称为字符的编码。当然每个人都可能会给出一种编码。 例如,小明希望用01110000表示小写字母a,而用11110000表示大写字母F;可是Tom喜 欢用01110000表示字母T,而用11110000表示字母o,用00000100表示字母m。显然, 要想使不同的计算机能够互相识别各自表示的字符,就必须使用相同的编码,这就是编码标 准。不过,标准也有很多。各个国家和很多公司都制定了标准。本节介绍3个有代表性的 编码标准,它们分别是:使用最多的字符编码———ASCI 码,汉字编码标准之一——— GB2312,以及力争统一全世界字符的统一码———Unicode。 3.简单字符的编码:ASCII码 3.1 使用最广泛的编码标准是美国信息交换标准代码(AmericanStandardCodefor InformationInterchange),其英文首字母缩写是ASCI,所以这种编码被称为ASCI 码。这 种编码用8位表示128个字符。这些字符包括10个阿拉伯数字(0~9 )、52个英文字母 (a~z和A~Z)、34个专用符号和32个控制符号。表示128个不同的符号只要7位二进制 数就够了,而8位的0/1串可以有256个不同序列。实际上ASCI 码的最高位都为0,也就 是说它只用了后面的7位,所以一共只表示了128个不同的字符。具体的编码规则如表3-1 所示。有些公司会对最高位进行定义,这样就可以再多表示128个字符,这种编码被称为扩 展的ASCI 码。 在表3-1中可以看到,ASCI 码用十进制数97对应的二进制0/1串,也就是0110 0001,表示小写字母a。根据这种编码规则,如果想在计算机中存储小写字母a,计算机就在 存储器中存储01100001 。现在问题出现了。如果存储器某个单元的内容是01100001,它 表示的是字母a还是数字97呢? 在实际的计算机系统中,如果计算机处于指令周期的取指令阶段,CPU从存储器取出 的内容会被当作机器指令来解释。机器指令也是一种0/1串,将在3. 4节说明。在执行指 90 第3章 信息表示 91 表3-1 ASCII码表 十进制 十六进制 八进制 字符 十进制 十六进制 八进制 字符 十进制 十六进制 八进制 字符 十进制 十六进制 八进制 字符 0 0 000 NUL 32 20 040 SPACE 64 40 100 @ 96 60 140 ` 1 1 001 SOH 33 21 041 ! 65 41 101 A 97 61 141 a 2 2 002 STX 34 22 042 " 66 42 102 B 98 62 142 b 3 3 003 ETX 35 23 043 # 67 43 103 C 99 63 143 c 4 4 004 EOT 36 24 044 $ 68 44 104 D 100 64 144 d 5 5 005 ENQ 37 25 045 % 69 45 105 E 101 65 145 e 6 6 006 ACK 38 26 046 & 70 46 106 F 102 66 146 f 7 7 007 BEL 39 27 047 ' 71 47 107 G 103 67 147 g 8 8 010 BS 40 28 050 ( 72 48 110 H 104 68 150 h 9 9 011 TAB 41 29 051 ) 73 49 111 I 105 69 151 i 10 A 012 LF 42 2A 052 * 74 4A 112 J 106 6A 152 j 11 B 013 VT 43 2B 053 + 75 4B 113 K 107 6B 153 k 12 C 014 FF 44 2C 054 , 76 4C 114 L 108 6C 154 l 13 D 015 CR 45 2D 055 - 77 4D 115 M 109 6D 155 m 14 E 016 SO 46 2E 056 . 78 4E 116 N 110 6E 156 n 15 F 017 SI 47 2F 057 / 79 4F 117 O 111 6F 157 o 16 10 020 DLE 48 30 060 0 80 50 120 P 112 70 160 p 17 11 021 DC1 49 31 061 1 81 51 121 Q 113 71 161 q 18 12 022 DC2 50 32 062 2 82 52 122 R 114 72 162 r 19 13 023 DC3 51 33 063 3 83 53 123 S 115 73 163 s 20 14 024 DC4 52 34 064 4 84 54 124 T 116 74 164 t 21 15 025 NAK 53 35 065 5 85 55 125 U 117 75 165 u 22 16 026 SYN 54 36 066 6 86 56 126 V 118 76 166 v 23 17 027 ETB 55 37 067 7 87 57 127 W 119 77 167 w 24 18 030 CAN 56 38 070 8 88 58 130 X 120 78 170 x 25 19 031 EM 57 39 071 9 89 59 131 Y 121 79 171 y 26 1A 032 SUB 58 3A 072 : 90 5A 132 Z 122 7A 172 z 27 1B 033 ESC 59 3B 073 ; 91 5B 133 [ 123 7B 173 { 28 1C 034 FS 60 3C 074 < 92 5C 134 \ 124 7C 174 | 29 1D 035 GS 61 3D 075 = 93 5D 135 ] 125 7D 175 } 30 1E 036 RS 62 3E 076 > 94 5E 136 ^ 126 7E 176 ~ 31 1F 037 US 63 3F 077 ? 95 5F 137 _ 127 7F 177 DEL 令阶段,CPU需要从存储器取操作数进行运算,这时从存储器取出的内容就会被解释成数 据。但是,这并不能回答前面提出的问题。如果取数据时取出01100001,那么可以解释成 97,也可以解释成字母a。这个问题的解决留给了程序设计。当用某种程序设计语言写程 序时,如果需要在存储器中存储数据,必须首先申请存储单元,并且要指明这个存储单元准 备存储什么类型的数据。用程序设计语言的说法就是必须首先定义一个变量并且声明变量 的类型。变量其实就是给存储空间起的别名, 这样,只要说“空间站”,指的就是中央大街115号。定义变量就是申请存储空间,当程序中 定义了一个变量时,计算机会分配一个存储单元,并且用程序中给出的变量名标识这个存储 单元。例如,程序中定义了一个名叫age的变量。定义变量除了要起名外,还要声明变量的 类型,也就是说明该存储单元要用来存储什么类型的数据。例如, 的存储单元要存储整数。这样,当计算机从ag 个0/1串解释成整数97,而不是字母a。与之相对的是, 示变量age所对应的存储单元要存储字符。那么, 会把它解释成字母a,而不是整数97。 .............. .................................. .. .... .. ................................ .................................................................................... 为字符规定一个对应的0/1序列,称为字符编码。 现在存在很多个字符编码标准。 计算机中的0/1串可以被解释成字符、数字、 程序中的变量必须声明类型,计算机才能正确解释它的内容。 .............. 重点提 3.3.2汉字字符的编码:GB2312ASCII码解决了简单字母和符号在计算机中的表示问题。可是,要在计算机中存储的内容 还有很多。例如,你想把最近写的一首小诗存在计算机中,然后把它放到网上,让大家欣赏。当 然,你的诗是用汉字写的。再如,要把原版的《一千零一夜》做成电子版。它是用阿拉伯文写的, 同英文以及汉字完全不同。其实,仍然只要为每个需要表示的字符定义一个0/1串就行了。每 一种定义就形成一种编码。当然,在解释这些0/1串时, 出最初的内容。上网时用户经常会遇到一种情况:网页上显示的都是一些看不懂的符号,人们将 其称为乱码。这时需要在浏览器的菜单栏中找到“查看” →“编码” 很多名称,例如阿拉伯文、简体中文、繁体中文、 到网页上的内容看起来像是可以理解的文字为止。从这个菜单上列出的选项,可以对各种文字 的编码有初步的认识:编码方案真是够多的! 每种文字至少有一种编码。 这里不能对所有编码都进行介绍,只对汉字编码方案进行简要介绍。GB2312是我国 在1980年颁布的第一个汉字编码国家标准。它的全称是《信息交换用汉字编码字符集基 本集》,它的标准号是GB2312—1980。在这个标准中, 形字符。GB2312一共对7445个图形字符进行了编码, 丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、 够表示的汉字数量为6763个。每一个图形字符都用两字节表示。 GB2312定义了一个代码表,对其支持的7445个图形字符进行了编号。代码表分为 就好像把中央大街115号起名为“空间站”。 intage表示变量age标识 e这个存储单元取出01100001时, 就会把这 如果定义ag e时写的是ch arage, 表 当计算机从age中取出01100001时, 就 示 指令等,计算机系统根据具体情况进行相应的解释。 要知道用的是哪种编码方案,才能还原 选项(见图3-1),然后就会看到 希伯来文等。需要在这些名字中间试验选择, 直 汉字以及一些序号、字母等被称为图 其中包括一般符号、序号、数字、拉 汉语注音字母、汉字等。GB2312能 92 第3章 信息表示 93 图3-1 浏览器的“编码”选项 94个区,每个区中有94个图形字符的位置,GB2312把这些位置称为位。所以,一个区中 就有94个位。区的编号(区号)是1~94,位的编号(位号)也是1~94,所以一个图形字符的 编码就可以用它的区号和位号表示了。区号加上位号也被称为区位码。例如,汉字“啊”在 16区的第一位,所以它的区位码是16-01,写的时候区号和位号用连字符相连。如果计算机 上有区位码输入法,那么用的就是这个编码方案。 但是,GB2312并没有用区位码作为每个图形字符的最终编码。GB2312最终定义并 使用的编码被称为国标码。国标码实际上是在区位码的基础上加上十六进制数2020H。 那么,最后计算机中存储汉字“啊”用的是哪个0/1串? 是16-01换算成十六进制数加上 2020H 的和的二进制表示吗? 非也! 因为计算机系统中可能同时支持ASCII码和国标码。 这时候就会带来一些麻烦。例如,两个字节单元的内容是3021H 时,如果解释成国标码,那 么表示的就是汉字“啊”(用区位码16-01计算一下看看对不对);如果解释成ASCII码,那么 就是字符0' '和'! '(查表3-1核实一下)。所以,为了解决这个问题,计算机中并不存储汉字的 国标码,而是再把它加上十六进制数8080H,这样就保证两个字节单元的最高位都是1,也 就能与ASCII码区分开了。最后存储在计算机中的这个编码称为机内码。 图3-1中的“简体中文(GB18030)”是我国于2000年发布的国家标准,全称为《信息技 术中文编码字符集》,完全兼容GB2312。 ........ .................................................................................... .................................................................................... ASCII码是使用最广泛的编码标准,它使用7位编码表示128个字符。 GB2312是我国为了能在计算机内存储和表示汉字,在1980年颁布的国家标准。 .......... 重点提示