您的位置:首页 > 理论基础

程序员应该了解的计算机知识(三)――信息表示和编码

2013-09-23 21:26 666 查看

引言

前面简单介绍过二进制数制系统,这里不作多的赘述。话说计算机只能识别二进制数制系统,这句话其实并不怎么确切。我们知道计算机是有多个电子元件组成的,而电子元件一般都存在两个状态(例如:通电或断点两个状态),与二进制数制系统只有两个数码(0或1)比较类似,所以计算机的CPU内部程序集(指令集)就使用0或1来表示其不同组件的电子元件的状态,因此也就出现了计算机只能识别二进制数制系统这句话。
程序是由指令序列(一串二进制数码)组成的,其序列的排列和组合方式与具体的CPU机器有关,这个程序指令序列可以与CPU中的指令集相映射,能够解析为具体的指令从而来支配计算机完成工作。这也就是程序的执行原理。
废话说了这么多,无非是想说一个问题,计算机只能识别0和1组成的二进制数值,那么为什么计算机又能呈现给我们形形色色的信息呢?答案就是――编码,某些时候也成为编译。计算机中的任何程序、文件以及符号、数值等都是按规则编码为0和1的二进制数码序列后的信息,然后由CPU支配电子元件的不同动作而呈现不同的效果的。

数值数据表示方式

这里所说的数值主要指某个数制系统下的所有数码以及正负号(±)和小数点(.)组成的数值,是相对其它非数值符号而言的,主要用于表示量的单位。
某个数据的真实大小(即数学范围中的大小)称为真实值,通常真实值可分为整数、0和负数,也可分为小数和整数。而在计算机中某个数据只能通过电子信号模拟表示或通过电子元件组合模拟存储,在计算机中的数值表示称为机器数或机器码。机器数就是将现实中的数据使用二进制数码来模拟机器元件,将其信号化,通常可分为无符号数和有符号数,有符号数又可分为正数、负数、小数等;又可分为定点数和浮点数等等,各种划分方式都有一定的衡量标准。下面主要介绍机器数的表示方式,也就是计算机中数值数据的编码方式。(以下均以十进制计算机中的表示方式进行介绍)

1.无符号数

这里所说的无符号数主要指无符号的整数(这里笔者把小数点和正负号作为符号进行划分,所以无符号的就只有整数了,而且还是数学中的正整数,有些理解不同,请勿误解)。
在计算机中1个字节等于8位,也就是说一个字节可以表示256种不同的信息(每一位都有0和1数码随机排列组合,即得出28=256种不同的组合方式,所以说一个字节可以表示256种不同的信息)。先假设0用00000000来表示,1用00000001来表示,2用00000010来表示,依次类推,可以得出其最大的数码为11111111,我们将其转换为十进制数值则分别为0、1、2……255,这就是计算机表示和存储无符号整数的原理,不难看出计算机中一个字节最大能够表示的无符号的整数为范围为0~255(0~28-1)。在编程的过程中你肯定会发现任何一种数值类型都是有其数值表示范围的,也就是这个意思。
事实上,机器数的表示范围受机器本身处理能力(主要指CPU字长)限制,比如8位的CPU中,可以表示的无符号机器数范围为0~28-1,其使用一个字节表示一个数值,例如00000000表示0,00000001表示1,00000010表示2,依次类推;16位的CPU中,可以表示的无符号机器数范围为0~216-1,其使用两个字节表示一个数值,例如00000000 00000000表示0,00000000 00000001表示1,00000000 00000010表示2,依次类推;32位CPU中,可以表示的无符号机器数范围为0~232-1,其使用四个字节表示一个数值;64位CPU中,可以表示的无符号机器数范围为0~264-1,其使用八个字节表示一个数值。可以看出CPU字长越长,其表示的数据范围越大,当然计算就越精确,但是其计算速度会相应下降。
无符号数据使用与机器相关的位数来表示,范围为0~2n-1(n表示机器位数)。无符号数据在计算机中表示相对比较简单,给定一个无符号的二进制数码则可以轻松的转换为其对应的十进制数值。

2.有符号数

这里所说的有符号的数主要指正负数和小数(这里笔者把小数点和正负号作为符号进行划分,所以有符号的就就是正负数和小数,有些理解不同,请勿误解)。
由于计算机只能识别0和1两种符号,所以像数学中的正负号(“+”、“-”)和小数点(“.”)这些符号其都无法识别,只能使用0或1来代替,由于0和1默认都表示数值,所以只能通过数位(数码的位置)来描述正负号或小数点,这个过程称为“符号的数字化”过程。
根据小数点位置的固定与否可以将数值分为定点数和浮点数两大类。定点数就是小数点的位置固定不变的数值;浮点数就是小数点的位置不能固定的数值。
2.1.定点数表示 定点数就是小数点位置固定不变的数据,可以表示所有的整数和小于1且大于0或大于-1且小于0的所有小数。因为整数的小数点固定在其数值的最右边,而大于-1小于0或小于1或大于0的小数的小数点固定在其数值的最左边。
数有正负之分,计算机中对正负号的数字化过程规定,二进制数码序列的最高位表示符号位,用来决定数值的正负形式;符号位上使用“0”表示正号(“+”),使用“1”表示负号“-”。由于二进制数码序列的最高位称为符号位,不具有实际数值意义,所以二进制数的形式值与其真值存在差异。比如在8位的机器中,二进制数值00000001表示十进制的+1,而10000001则表示十进制的-1。有符号的整数可以使用以下通用方式进行描述:



其中“S”表示符号位(0表示“+”、1表示“-”),占一位;“M”表示数值位,占多位。整体表示一个二进制的正负数值。
对于定点小数一样,其也存储正负之分,其最高位表示符号位,其他位表示数值位,而其小数点则是固定在其符号位和数值位之间。这里不做多的介绍,其表示方式与整数非常类似,例如00000001可以表示0.1,而10000001则可以表示-0.1。
从对无符号整数的介绍中可以知道,计算机中一个字节可以表示256种不同的数值,对于无符号的数值的范围可以看作0~28-1(即0~255),而对于有符号的数值,其每一种表示法的最高位作为符号位进行处理,没有实际数值意义,则最小为11111111(-127),最大为01111111(+127),所以其能够表示的有符号的整数数值范围为-127~+127(-27+1~+27-1);从另一个角度分析,其一个字节可以表示的有符号的小数范围则为-0.127~+0.127。事实上,不同的CPU字长所表示的有符号数值范围有所不同,具体与机器本身有关。

2.2.浮点数表示 上面主要介绍的是整数的表示方式,而关于小数的表示不仅需要考虑其正负符号,还需要考虑其小数点的位置。由于过于复杂,所以大多数的资料文献都是一笔带过。这里也简单的介绍一下。
小数根据小数点的位置固定与否可分为定点小数或浮点小数两大类。定点小数上面也提到过,由于其小数点的位置固定不变,所以其表示方式与整数表示方式非常相似。这里主要介绍一下浮点小数的表示方式。
浮点小数是小数点位置不固定的小数形式,由于其小数点位置不固定,所以并不能像定点小数那样表示,首先其也有正负之分,所以必须使用一位来作为符号位表示其数值的正负,其次为了临时表示其小数点的位置必须使用几个数位来描述小数点的位置,再次就是要表示数值的大小,其通用格式如下图:



其中“S”表示符号位(0表示“+”、1表示“-”),占一位;“P”表示阶码,即用来描述小数点的位置;“M”表示数值位,占多位。整体表示一个二进制的正负浮点数值。
浮点数的阶码通常使用移码的方式来表示,在计算机中的浮点数阶码是一个n位的整数,表示2的指数,可以有符号。移码固定对于一个n为的阶码N,其移码公式为:
N移=2n-1+N (-2n-1≤N<2n-1)
N移=1+N (-1≤N<1)
其中N表示阶码数值,n表示阶码位数。具体的内容可自行深究。
在计算机中以近似值表示所有的实数,类似于十进制中的科学计数法,计算机中的浮点数可以表示为N=2n×S,其中2n称为数N的指数(也成为阶码),用于表示小数点的具体位置;S为数N的尾数部分,用于表示数的符号和有效数值。为了更精确的表示浮点数,现在的同样浮点数表示规范如下图:



其中阶符和阶码合在一起用来表示小数点的位置,并且规定阶码必须为整数;尾符和尾码用来表示小数的精度,并且固定尾码必须是定点小数,尾码的数值绝对值必须大于0.1并且小于1;阶符和尾符分别占一位,0表示正,1表示负,阶码和尾码根据机器不同和浮点数精度不同所占位数要求不同。例如0.1011×2100与0.01011×2101两种表示方式,在我们看来都是一样的,但是机器是有一定位数限制的,如果尾数部分只存在4位,则第二种表示方式将存在误差,所以为了减小误差,规定尾码的绝对值必须大于0.1并且小于1。比如在8位的机器中,二进制浮点数N=210×0.1010其对应的机器数为01001010,各位表示含义如下图:



如果是二进制浮点数N=210×-0.1010其对应的机器数为01011010,如果是二进制浮点数N=2-10×-0.1010其对应的机器数为11011010。
二进制浮点数中的阶码用于决定数的范围,如果不给定其占用位数,则很难决定其所能表示的小数数值范围。当二进制浮点数的尾数为0其表示机器数零,当其阶码为最小时该浮点数最接近于零,可在所能表示的范围内近视为零。浮点数的尾数是决定了该浮点数的基带大小,都是以定点小数来表示的,类似整数的表示方式,浮点数的运算级别都是将位数进行运算。

数值的编码和运算

计算机数值可划分为有符号和无符号两大类,无符号主要是指0和正整数;有符号的数值主要指正负数和0。无符号的数值编码相对比较简单,使用指定位数(与机器有关)的二进制数码序列直接表示即可,其运算也相对简单,每一位均参与运算;而有符号的整数和定点小数在编码过程中均需要提供一个数位作为符号位用来表示其数值的正负号,因为其减少了一位有效数值位,所以其运算过程相对较为复杂;而有符号的浮点小数在编码过程中不仅需要提供一个数位来表示其数值的正负,还需要多个数位来表示其小数点的位置,所以其运算过程更为复杂。
其实在大多数情况下我们使用的都是有符号的数值,那么计算机到底如何存储如何运算呢?下面就来探讨一下计算机到底是如何进行有符号数值运算的。

1.原码、反码和补码

计算机中有符号数值编码方式存在三种形式――原码、反码和补码,下面一一简单介绍。
1.1.原码 使用数码表示数值符号的方式称为原码。即在二进制数码序列中最高位表示符号位,使用0表示正号,1表示符号;除过符号位其他所有位表示数值的大小,这种表示数值的方式称为原码表示法。例如在8位的机器中1的原码为00000001,而-1的原码为10000001,其二进制数值中的左边最高位不同。不难看出0存储两种原码表示方式00000000或10000000。从数学的角度去解释,可使用一下公式得出原码:
整数的原码

N原=N (0≤N<2n-1)
N原=2n-1+|N| (-2n-1<N≤0)

定点小数的原码

N原=N (0≤N<1)
N原=20+|N| (-1<N≤0)
其中N表示一个n位的二进制机器数,n表示机器字长。
原码是有符号数据在计算机中的最简单的编码方式,主要用于输入输出数据,由于其与真值之间存储误差,所以并不能直接参与运算。对于一个字长为n的机器,其能够表示的数据个数为2n个;其能够表示的无符号的数据范围为0~2n-1;其能够表示的有符号的数据范围为-2n-1+1~+2n-1-1。
再来看看原码是否能够参与运算?例如使用原码来计算十进制算式-1+1,以8位的机器为例,-1的原码为10000001,1的原码为00000001,10000001+00000001=100000010,将其结果转为十进制就是-2,显然是错误的。我们来分析一下,为什么?原码的最高位表示的是数值的符号,并不表示数值的大小,而上面的算式中将其作为数值的大小进行运算显示是错误的。所以得出一个结论:原码不能参与运算;如果非要强制运算,其符号位绝对不能参与运算,但是其结果的符号又该如何给定,需要比较原始数据的大小来给定。
1.2.反码 就对上面的使用原码计算-1+1的例子来看,其结果是-2,显示是错误的。我们知道-1+1=0,而通过原码计算后得到的结果为-2,主要是由于其符号位参与了运算导致错误的出现。计算机在处理数据时只能将其每一位作为数码进行运算,如果将符号位提取出来单独处理则过于复杂,经过研究也就出现了一种新的有符号数据表示方式――反码。
反码是计算机中表示数值的另一种方式,主要用于表示负数。反码规定正数的反码形式与其原码形式相同;负数的反码形式是在其原码形式的基础上除过符号位按位取反的结果。这里的“取反”就是二进制中的逻辑非运算,即如果某一位上为1则取反后为0,如果为0则取反后为1。比如8位机器码00000001(1)的反码为00000001,10000001(-1)的反码为11111110。不难看出0存储两种反码表示方式00000000或11111111。从数学的角度去解释,可使用一下公式得出反码:
整数的反码

N反=N (0≤N<2n-1)
N反=(2n-1)+N (-2n-1≤N≤0)
定点小数的反码

N反=N (0≤N<1)
N反=2-2-(n-1)+N (-1<N≤0)
其中N表示一个n位的二进制机器数,n表示机器字长。
反码主要是相对原码而言的,其表示数据的范围与原码一一对应,而反码与原码的区别就是其可以直接参与运算。下面来看反码如何参与运算,还以开头的例子为例,-1的反码是11111110,1的反码是00000001,其-1+1的反码运算就是11111110+00000001=11111111,其原码为10000000,换算为十进制就是-0。再来看使用反码计算1-2,在8位的机器中,原码形式为00000001+10000010,反码形式为00000001+11111101=11111110,其结果的原码为10000001,换算为有符号的十进制数值则为-1。显然可以看成反码可以解决原码符号位不能参与运算的问题。
1.3.补码 或许你会发现,反码虽然解决了原码的本质问题(符号位不能参与运算),但是上面通过反码运算-1+1得到的结果为-0,然而这并不符号现实逻辑,因为现实中不存在正负零之分,虽然得到了想要的结果,但是并不合理。为了更合理的运算,就出现的另一种数据表示方式――补码。什么是补码?暂且不说,且先看看“模”的概念。
在数学代数中,模表示一种代数体系,可视为一个环形的代数体系,最简单的模型就是“钟表”,在该计量器中,可以看到其所表示的量的范围为1~12(12个量),则其模为12。例如3点这个量,既可以看作12点逆转9个量,也可以看作12点正转3个量,也就是说,在钟表中3=12-9=12+(12-9)=15,可以将减去9的运算等价为加上3的运算。可以得出一个特点,在模内的减法运算都可以转化为对应的加法运算。从另一个角度看,模为12的计量器中,3和15存储一个共同的特点,其除以12的余数都是3,这时称为3和15为同余的数,也成为互补的数。同余是模计量器中的一个概念,模中A、B两个数除以模数N得到的余数相同,则称为A、B同余。互补也是模计量器中的一个概念,在模N的计量器中,一个数A与N-A是一对互补的数,其特点是可以将减法转换成加法,例如X-A=X+(X-A)。
在计算机中模表示一种计量系统的计数范围,我们知道对应一个n位的机器,其计量范围为0~2n-1(共2n个量),则其模就是2n。我们可以看出计算机中模的概念与钟表的模型非常类似,借助可以将减法转换为加法的思路,为了进一步简化计算机中的电路设计,所以就诞生了补码的概念。
补码是计算机中表示有符号数值的一种方式,补码表示方式规定正数的补码形式也其原码形式一致;负数的补码形式是在其反码的数值位(除符号位外)末位加1,并且丢弃最高进位。例如8位的机器中,1的原码为00000001,其补码也为00000001;而-1的原码为10000001,其反码为11111110,其补码为11111111,可以看出0只存储一种补码。由于0的补码只有一种方式,所以多出一中数值量,规定使用-128来代替原有的负零(-128并没有对应的原码和反码,其实质是一种溢出的数值100000000),所以在8为的机器中其补码的表示数据范围为-128~0~127;也就是说对于n位的机器,其补码的表示范围与原码和反码稍有不同,为-2n~0~2n-1(共2n个数值量)。从数学的角度去解释,可使用一下公式得出补码:
整数的补码

N补=N (0≤N<2n-1)
N补=2n+N (-2n-1≤N≤0)
定点小数的补码

N补=N (0≤N<1)
N补=2+N (-1≤N<0)
其中N表示一个n位的二进制机器数,n表示机器字长。
补码是根据反码得出来的,主要通过互补的概念衍生的,补码的应用能够使计算机二进制运算进一步简化,而且符号位可以参与运算,比反码更为合理。来看一下-1+1的补码运算,其原码形式为10000001+00000001,其反码形式为11111110+00000001,其补码形式为11111111+00000001=100000000,转换为反码为11111111,转换为原码则为00000000,即0。
从上面的例子可以看出补码的运算比反码的运算更为合理,所以在计算机中所有的数码均以补码的方式进行表示或存储,以补码的方式进行运算。
1.4.总结 在计算机中所表示数值的范围与机器字长有关,而在编程语言中所表示的数据范围与规定字节有关。计算机中对有符号的数值编码方式分为原码、反码和补码三种,其中主要使用补码进行数据的运算和存储,由于补码表示法中可以将符号位直接参与运算,同时还能将所有的减法运算转化为加法运算。
原码规定有符号的二进制数据的最高位(第n位)为符号位,其余n-1位为数值位;如果符号位为0则表示真值为正数,如果符号位为1则表示真值为负数。

反码规定真值为正数时其反码与原码相同;真值为负数时其反码为原码基础上除符号位外逐位取反。

补码规定真值为正数时其补码与原码相同;真值为负数时补码为反码基础上最低位加1,并舍弃符号位进位(不能超过机器字长)。

对于一个正数其原码、反码、补码与其数值位完全相同;对于一个负数其符号位为1不变,原码的数值位与其数值位相同,反码的数值位为其数值位各位取反,补码在反码的最低位加1。

数据的反码的反码等于该数据的原码;数据的补码的补码等于该数据的原码。

在计算机内部,带符号的数据均使用补码的方式表示,使用补码形式进行运算后结果也是补码形式,如需得到真值,需要转换。如果结果的符号位为0,则将0转换为正号(“+”),数值位不变;如果结果的符号位为1,则将0转换为负号(“-”),数值位或者减1求反或者求反加1。

2.定点数的运算

关于定点数的运算,相对较为简单,只需要将其补码形式进行运算即可。比如计算3-5,下面以8位机器为例,首先看一下其3和5对应的原码、反码、补码对应列表:
真值原码反码补码
3000000110000001100000011
-5100001011111101011111011
计算3-5实质就是计算3与-5的补码和,3-5=3+(-5)=00000011+11111011=11111110,转换为反码为11111101,再转换为原码则为10000010,即为十进制的-2。
计算机中定点数的运算均是将其对应的补码进行和运算,然后将结果在转换为原码即可得出最终运算结果。

3.浮点数的运算

浮点数的运算,相对较为复杂,这里简单介绍一下浮点数的运算思路。
浮点数主要有阶码和尾码组成,阶码表示了浮点数的数值范围,而尾码表示了浮点数的数值精度,所以如果其阶码不同则无法参与运算。当参与运算的浮点数的阶码相同时,则直接将其尾码进行对应补码的运算即可,最后将结果在转换为对应的原码则就是其最终结果;当参与运算的浮点数的阶码不同时,首先要进行对阶操作,也就是将其按某一个精度转换为相同的阶码(过程就是除以或乘以21),然后再将其尾码进行对应补码的运算,最后将结果在转换为对应的原码则就是其最终结果。

4.溢出

“溢出”是计算机中常用的术语,简单的将就是某个值不能被计算机内存所表示,某个值二进制数码超出了机器所能容纳的最大位数。准确的说就是当两个有符号的数据进行运算时,得到的结果超出了当前机器可以表示的有符号的数据范围(对于一个n位的机器来说,所能表示的有符号的数据范围为-2n-1+1~+2n-1-1,其中包括正负零,这里先不说正负零的问题),就出现了“溢出”的现象。那么如何解决溢出问题,这是机器的事情,这里不说,我们需要有效的预防即可。
当加法运算过程中出现“进位”时,但是该进位已经超出了数值位的长度时则会出现“上溢出”现象;当加法运算过程中出现“借位”时,但是该借位已经超出了数值位的长度时则会出现“下溢出”现象。

非数值数据编码

计算机处理的信息包括数值、文件、符号、语音、图形、图像等。在计算机内部各种信息都必须以数字化的二进制编码形式传送、存储和加工,因此,不管是什么信息都应转化为二进制编码。编码的过程可以通过少量的二进制数位,通过一定的组合规则,表示出大量复杂多样的信息。以下主要介绍十进制数值编码、英文字符编码和中文字符编码三种编码方式,只是简单介绍,具体原理须自行深究。

1.BCD码

计算机内部使用二进制表示所有的数据,而我们习惯使用十进制。在数字系统中除了采用机器数表示二进制数以外,有时需要用若干位二进制数表示一位十进制数,以便能在数字系统中表示和使用十进制数,适应处理十进制数的需要,所以就诞生了一种使用二进制码表示十进制数的编码方案――BCD码。
BCD(Binary Coded Decimal)码是一种通过四位二进制码表示一位十进制数的编码方法。其特点是:四位二进制码本身的指就是其对应的十进制数码的真值。四位二进制各位的位权由高到低分别为23、22、21、20,因此也称为8421码。8421码与十进制数码的编码规则如下图:



例如,十进制的3的BCD码为0011,十进制的931的BCD码为1001 0011 0001。这是一种编码方式,并非其二进制原码表示方式。如果计算机使用BCD码进行十进制数值编码,那么其在计算机中的编码存储方式将以BCD码存储,计算机需要内置对应的BCD码编码和解码算法来实现其处理过程。

2.ASCII编码

因为计算机采用高低电平来分别模拟1和0两个数码,所以计算机只能存储和传输二进制数码。为了能够使用一种统一的方式表示数字字符(数字字符与数字是不同的概念)、字母字符以及常用符号,所以就产生了另一种国际化的标准编码方式――ASCII编码。
ASCII(美国标准信息交换码)是基于拉丁字母的一套电脑编码系统,可以对现代英语和其它西欧语言进行编码,是一种单字节字符编码方案,主要用于文本数据编码,用于计算机与计算机、计算机与外设之间传递信息。
ASCII规定使用8位(一个字节)二进制数码组合来表示128或256种可能的字符,所以称为单字节编码。标准的ASCII码最高位为0,使用7位二进制数码来表示所有的大小写字母、数字0-9、标点符号以及美式英语中使用的特殊控制字符。当固定最高位为0后,其余7位可能表示的有效字符为27=128个,分别对应十进制的0~127共128个数值。标准ASCII编码与字符对照表如下图:



其中第一行表示前四位编码,第一列表示后四位编码,其组合的编码对应的符号如图中黄色部分,将其组合的结果转换为十进制数值的范围为0~127。其中0~31及127代表的33个字符是计算机的控制字符或通信专用字符,32~126代表的95个字符称为可显字符(其中SP表示space空格符号),即有特定的图形显示。可显字符中48~57表示0~9十个数字,65~90表示26个大写英文字母,97~122表示26个小写英文字母,其它的表示一些常见标点符号和运算符等。例如字符串“Hello”使用ASCII编码后在内存单元中的编码为01001000 01100101 01101100 01101100 01101111。
由于标准的ASCII码只能表示128个符号,远远不能满足现实中的符号要求,所以后来就将标准ASCII码的最高位也用作编码位,这样就又多出了128个符号,这些符号称为扩展ASCII码,其能够对大部分的西欧符号进行表示。由于ASCII码通用性较为广泛,所以我们将ASCII单字节编码的字符称为ASCII字符。

3.汉字编码

汉字的特点是象形文字,单字单音,而且数据非常庞大,字形复杂,要在计算机中以二进制序列的方式表示一个汉字,远远要比ASCII码复杂。所以规定汉字在输入、输出、存储和处理过程中所使用的汉字编码均不相同。
计算机中汉字的表示同样需要使用固定的二进制进行编码,根据应用目的的不同,汉字编码可分为外码、交换码、机内码和字形码四种方式。

3.1.外码(输入码) 外码也称为输入码,是用来将汉字输入到计算机中的一组键盘符号,即就是通过键盘输入的各种字符符号序列。常用的输入码有拼音码、五笔字型码、自然码、表形码、认知码、区位码和电报码等。
我们知道汉字的输入方式(也成为输入法)存在多种多样,外码则是由汉字输入法管理的,例如使用拼音输入zhong1,表示“中”这个汉字,那么“zhong1”则就是汉字“中”的外码。外码只是一种识别汉字的编码方式,通过外码可以在输入法程序中找到合适的汉字,不论某一个汉字的外码如何变化,但是其机器码(二进制数码)是不变的,当我们输入外码后会通过对应的算法程序将汉字转换为对应的机器码。

3.2.交换码(国标码) 计算机中以二进制代码的方式表示一个汉字,而二进制代码使用起来并不方便,所以需要使用一种方便的编码来与二进制编码进行映射,于是就出现了交换码。汉字信息交换码简称为“国标码”即GB2312-80编码标准,该标准中收入了6763个常用汉字(其中一级汉字3755个,二级汉字3008个),以及英、俄、日文字母与其他符号687个,一共7000多个符号。
国标码的编码规则是:每个汉字由一个2字节(16位二进制)编码组成,每个字节的最高位置“0”,其余7位用于组成各种不同的码值。为了不与ASCII码的控制字符相同,每个字节剔除了34个ASCII码的控制字符,每个字节还剩94个编码。两个字节组成一个二维结构,前一个字节称“区”,后一个字节称“位”,所以国标码也称为区位码,一共可以表示94×94个即8836个汉字以及其他符号。已被占用7000多个符号,剩余的位置作为备用。

3.3.机内码(内码) 汉字的机器码是计算机内部存储和处理汉字的代码,简称“内码”。内码描述的是计算机中汉字的实际表示方式。机内码是计算机内部存储和加工汉字时所用的代码。不管用何种汉字输入码将汉字输入计算机,为存储和处理方便,都需将各种输入码转换成长度一致的汉字内部码。
汉字信息机内码编码规则:在国标码的基础上,把2个字节的最高位一律由“0”改“1”构成。若最高位为“1”,视为汉字编码,为“0”,视为ASCII字符。因此,同一个汉字的交换码和机内码并不相同,而同一个ASCII字符的交换码和机内码则相同。

3.4.字形码 汉字字形码是汉字输出码,是汉字显示、打印的图形编码,又称为字模码。计算机在输出汉字时都采用图形方式,无聊汉字的笔画多少,每个汉字都可以写在同样大小的方块中。通常使用16×16点阵方式来显示汉字。

总结

计算机通过电子元件电平的高低来模拟二进制数码1和0,存储在计算机中的任何信息都必须以二进制数码的方式出现才能完成处理工作,原始的二进制数码序列称为信息的机器码,二进制数码通过补码的方式才能完美的进行运算。为了能够描述更多的符号信息,出现了各种符号信息的编码规范,编码是将任何一个符号转换为计算机能识别的二进制数码序列的过程。
再说后话,本篇的内容或许对大多数的人来说都是“班门弄斧”,笔者是半道入行IT的,对计算机基础知识了解甚少(不明说,你懂得),这些内容都是笔者通过各种文献资料总结的,不对的地方肯定有,所以希望大家不要见笑,多多喷墨……
本文出自 “阿酷呆” 博客,请务必保留此出处http://akudy.blog.51cto.com/2277883/1300810
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: