第3章 计算机中的数据表示 计算机的功能就是进行数据处理(信息处理),目前的计算机不仅能处理数值型数据,还能处理非数值型数据,包括英文字符、汉字、图像、音频和视频等多种媒体数据。数据在计算机中的表示与存储是数据处理的基础。我们知道,所有数据在计算机内部都是以二进制形式存储的,那么现实中丰富多彩的多种媒体数据是如何转换为计算机中的二进制数据呢?本章对此进行介绍。 3.1计算机中的进制 3.1.1进位记数制 按进位的原则进行记数称为进位记数制,简称进制或数制。日常生活中,人们习惯于用十进制进行记数。但在计算机内部,为了便于数据的表示和计算,采用二进制记数方法。二进制数在计算机中易于表示(只有0和1两种形式)、存储和计算,但二进制数的一个缺点是表示一个数需要的二进制位数较多,给人们的阅读、书写、记忆等带来不便。例如,十进制数(2695)10,用二进制数表示则需要12位二进制数字(101010000111)2。为了便于人们阅读和书写,在编写程序时,经常使用十进制数,有时也用八进制数和十六进制数。 不同进制有不同的基数和位权。 1. 基数 每种进制中数码的个数称为该进制的基数。例如,二进制中只有两个数码(0和1),其基数为2,计算时逢2进1; 十进制中有10个数码(0~9),其基数为10,计算时逢10进1。 2. 位权 在每种进制中,一个数码所处的位置不同,代表的数值大小也不同,称为具有不同的位权。例如,十进制数9999,最左边的9代表9千,最右边的9代表9个。也就是说,该十进制数从右向左的位权依次是个(100)、十(101)、百(102)和千(103)。 在编写程序时,根据需要可以用二进制、十进制、八进制或十六进制来表示数据,但在计算机内部,只能以二进制形式表示和存储数据(包括程序代码也只能用二进制表示)。所以计算机在运行程序时,需要先把其他进制数据转换为二进制数据再进行处理,处理结果(二进制形式)在输出时再转换为其他进制,以方便用户阅读和使用。表3.1给出了常用进制的基数和所需要的数码,表3.2给出了常用进制的表示方法。从表3.2可以看出,十进制数13和二进制数1101、八进制数15、十六进制数D是等价的。 表3.1常用进制的基数和数码 进制 基数 数码 二进制 2 0 1 八进制 8 0 1 2 3 4 5 6 7 十进制 10 0 1 2 3 4 5 6 7 8 9 十六进制 16 0 1 2 3 4 5 6 7 8 9 A B C D E F 注:因为只有10个数字符号(0~9),而十六进制需要16个数码,所以除0~9外,再选用A~F(也可以写为小写形式a~f)作为十六进制的数码。 表3.2常用进制的表示方法 十 进 制 数 二 进 制 数 八 进 制 数 十六进制数 0 0 0 0 1 1 1 1 2 10 2 2 3 11 3 3 4 100 4 4 5 101 5 5 6 110 6 6 7 111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F 16 10000 20 10 3.1.2不同进制数据的区分 为了便于区分各种进制的数据,常采用后缀或前缀法、角标法书写数据。 1. 后缀或前缀法 在数据后面或前面加写相应的英文字母作为标识,这种方式便于计算机识别。 B(binary)表示二进制数,二进制数101 可写成101B。 O(octonary)表示八进制数,八进制数101可写成101O 或101Q(由于字母O与数字0容易混淆,常用Q代替O)。 D(decimal)表示十进制数,十进制数101可写成101D(D可省略)。 H(hexadecimal)表示十六进制数,十六进制数101可写成101H。 2. 角标法 用圆括号把数据括起来,在括号外面加数字角标,这种方式便于人工阅读。 (101)2表示二进制数101。 (101)8表示八进制数101。 (101)10表示十进制数101,十进制数可省略角标。 (101)16表示十六进制数101。 3.2不同进制数据的相互转换 微课视频 不同进制的数据可以按一定规则进行相互转换。 3.2.1二进制数与十进制数的相互转换 1. 二进制数转换为十进制数 二进制数转换为十进制数,按权展开相加即可。 【例3.1】把二进制数(1101101.10111)2转换为十进制数。 (1101101.10111)2=1×20+0×21+1×22+1×23+0×24+1×25+1×26+ 1×2-1+0×2-2+1×2-3+1×2-4+1×2-5 =1+4+8+32+64+0.5+0.125+0.0625+0.03125 =(109.71875)10 2. 十进制数转换为二进制数 十进制数转换为二进制数时对整数部分和小数部分分别转换,整数部分采用除2取余法,直至商为0止; 小数部分采用乘2取整法,满足精度要求为止。 【例3.2】把十进制数(78.69)10转换为二进制数,小数部分保留4位。 先采用除2取余法把78转换为二进制数,算式如图3.1所示,结果为1001110; 再采用乘2取整法把0.69转换为二进制数,算式如图3.2所示,结果的近似值为0.1011。得到转换结果为(78.69)10≈(1001110.1011)2。 图3.1除2取余 图3.2乘2取整 说明: ①用除2取余法对十进制整数进行转换时,先得到二进制数的低位,后得到高位; 用乘2取整法对十进制小数进行转换时,先得到二进制数的高位,后得到低位。 ②一般来说,把一个带小数的十进制数转换为二进制数时,都是得到近似值,即一个实数在计算机内部存储的是二进制形式的近似值,所以当有实数参与运算时,结果也可能是一个近似值。 3.2.2二进制数与十六进制数的相互转换 1. 二进制数转换为十六进制数 (1) 计算方式: 先采用按权展开相加的方法把二进制数转换为十进制数,再采用除16取余、乘16取整的方法把十进制数转换为十六进制数。 【例3.3】把二进制数(1101101.10111)2转换为十六进制数。 从例3.1可知,二进制数(1101101.10111)2对应的十进制数是(109.71875)10。 把109.71875转换为十六进制数时,整数部分和小数部分分别转换。把109转换为十六进制数时采用除16取余法,算式如图3.3所示,结果为(109)10=(6D)16; 把0.71875转换为十六进制数时采用乘16取整法,算式如图3.4所示,结果为(0.71875)10=(0.B8)16。 合并后的转换结果为(109.71875)10=(6D.B8)16 图3.3除16取余 图3.4乘16取整 (2) 分组方式: 二进制数转换为十六进制数时,以小数点为界,分别向左、向右分成4位一组,不够4位补0,分组后对应成十六进制数。 【例3.4】把二进制数(1101101.10111)2转换为十六进制数。 (1101101.10111)2=(0110 1101.1011 1000)2 =(6D.B8)16 2. 十六进制数转换为二进制数 (1) 计算方式: 先采用按权展开相加的方法将十六进制数转换为十进制数,再采用除2取余、乘2取整的方法将十进制数转换为二进制数。 【例3.5】把十六进制数(3AC.1E)16转换为二进制数。 由于(3AC.1E)16=3×162+10×161+12×160+1×16-1+14×16-2 =768+160+12+0.0625+0.0546875 =(940.1171875)10 再采用除2取余、乘2取整法把(940.1171875)10 转换为二进制数,得到的结果为(1110101100.0001111)2。 (2) 分组方式: 把十六进制数转换为二进制数时,每一个十六进制位展开成4个二进制位即可。 【例3.6】把十六进制数(3AC.1E)16转换为二进制数。 (3AC.1E)16=(0011 1010 1100.0001 1110)2 =(1110101100.0001111)2 说明: 在进行进制转换时,计算方式比较适合编写程序实现,分组方式比较适合手工完成。 3.2.3二进制数与八进制数的相互转换 1. 二进制数转换为八进制数 (1) 计算方式: 先采用按权展开的方法把二进制数转换为十进制数,再采用除8取余、乘8取整的方法把十进制数转换为八进制数,类似于把二进制数转换为十六进制数。 (2) 分组方式: 把二进制数转换为八进制数时,以小数点为界,分别向左、向右分成3位一组,不够3位补0,分组后对应成八进制数。 【例3.7】把二进制数(1011001.10111)2转换为八进制数。 (1011001.10111)2=(001 011 001.101 110)2 =(131.56)8 2. 八进制数转换为二进制数 (1) 计算方式: 先采用按权展开相加的方法将八进制数转换为十进制数,再采用除2取余、乘2取整的方法将十进制数转换为二进制数,类似于把十六进制数转换为二进制数。 (2) 分组方式: 八进制数转换为二进制数时,每一个八进制位展开成3个二进制位即可。 【例3.8】把八进制数(276.15)8转换为二进制数。 (276.15)8=(010 111 110.001 101)2 =(10111110.001101)2 3.3数值型数据的表示 对于无符号的整型数据,无论用何种进制书写,都可以按一定规则转换为二进制数存储在计算机内。任何符号在计算机内部也只能以二进制形式表示,包括带符号数中的正、负号及小数中的小数点都以二进制形式表示。在计算机内部将数值型数据(真值)全面、完整地表示成一个二进制数(机器数),需要考虑4个因素: 机器数的符号、机器数的编码、机器数的表示范围和机器数中小数点的位置。 微课视频 3.3.1机器数的符号 在计算机内部,任何数据(符号)都只能用二进制的两个数码0和1表示。带符号数的表示也是如此,除了用0和1组成的数字串来表示数值的绝对值大小外,其正、负号也必须用0和1表示。通常规定最高位为符号位,并用0表示正,用1表示负。在一个字长为16位的计算机中,数据的表示如图3.5所示。 图3.5带符号数据的表示 最高位d15为符号位,d14~d0为数值位。这种把符号数字化并和数值位一起编码的方法,有效地解决了带符号数的表示及计算问题。 3.3.2机器数的编码 在确定了最高位用于表示机器数的符号之后,机器数通常有原码、反码和补码三种不同的具体表示形式。 【例3.9】分别给出十进制数+56和-56的原码、反码和补码,假定字长为16位。 通过除2取余运算,得到无符号十进制数56的二进制形式为111000。 +56的原码表示为0000000000111000(正数的原码最高位为0,数值位补足15位)。 -56的原码表示为1000000000111000(负数的原码最高位为1,数值位补足15位)。 +56的反码表示为0000000000111000(正数的反码与其原码相同)。 -56的反码表示为1111111111000111(负数的反码,在其原码的基础上,符号位不变,数值位按位取反)。 +56的补码表示为0000000000111000(正数的补码与其原码相同)。 -56的补码表示为1111111111001000(负数的补码,在其反码的末位加1)。 在计算机内部,一般用补码表示带符号数,这样可以把减法运算转换为加法运算。 【例3.10】计算x=86-25的值。 x=86-25可以转换为(x)补码=(+86)补码+(-25)补码进行计算,计算过程如下(假定字长为8位): 86的二进制形式为1010110,+86的补码表示为(+86)补码=01010110; 25的二进制形式为11001,-25的原码表示为10011001,补码表示为(-25)补码=11100111; (x)补码=01010110+11100111=00111101,由于最高位为0,因此(x)原码=00111101,其对应的十进制真值为61,即x=61,计算结果正确。 【例3.11】计算y=32-57的值。 y=32-57可以转换为(y)补码=(+32)补码+(-57)补码进行计算,计算过程如下(假定字长为8位): 32的二进制形式为100000,其补码表示为(+32)补码=00100000; 57的二进制形式为111001,-57的原码表示为10111001、补码表示为(-57)补码=11000111; (y)补码=00100000+111000111=11100111,由于最高位为1,因此(y)原码=10011001(先对补码减1,再对数值位按位取反),其对应的十进制真值为-25,即y=-25,计算结果正确。 从以上示例可以看出,用补码表示带符号数,可以把减法运算转换为加法运算。我们知道,乘法运算可以转换为加法运算,除法运算可以转换为减法运算,这样CPU中只有一个加法器即可完成加、减、乘、除四则运算,即补码表示可以简化计算机的CPU设计。 3.3.3机器数的表示范围 机器数的表示范围由计算机的字长决定,即由CPU中的寄存器决定。如果使用的是16位的寄存器,则字长为16位,一个无符号整数的最小值是(0000000000000000)2=(0)10、最大值是(1111111111111111)2=(65535)10,机器数的范围为0~65535。也就是说,对于一个16位的寄存器,只能表示0~65535的无符号整数。对于带符号整数,16位寄存器的表示范围是-32768~+32767。现在用的微型计算机一般是64位字长,其无符号整数的表示范围是0~264-1,带符号整数的表示范围是-263~+263-1。对于一般的应用场景足够了。 3.3.4机器数中小数点的位置 在计算机内部表示小数点比较困难,设计者把小数点的位置用隐含的方式表示。隐含的小数点位置可以是固定的,也可以是变动的,前者称为定点数,后者称为浮点数。 1. 定点数 在定点数中,小数点的位置一旦确定,就不再改变。定点数又分为定点整数和定点小数。 小数点的位置约定在最低位的右边,用来表示定点整数。小数点的位置约定在符号位(最高位)之后,用来表示小于1的定点小数。 【例3.12】假定计算机的字长为16位,用定点整数表示十进制数387。 由于387的二进制形式为(110000011)2,因此其在计算机内部的表示形式如图3.6所示。 图3.6计算机内部的定点整数 【例3.13】假定计算机的字长为16位,用定点小数表示0.625。 由于0.625的二进制形式为(0.101)2,因此其在计算机内部的表示形式如图3.7所示。 图3.7计算机内部的定点小数 2. 浮点数 如果要处理、存储的数据包括整数和小数,则难以用定点数表示。对此设计人员设计了浮点数的表示方式,即小数点位置不固定,是浮动的。 将十进制数758.2、-75.82、0.07582、-0.007582用指数形式表示,它们分别可以表示为0.7582×103、-0.7582×102、0.7582×10-1、-0.7582×10-2。 可以看出,在原数据中无论小数点前后各有几位数,它们都可以用一个纯小数(称为尾数,有正负之分)与10 的整数次幂(称为阶码,也有正负之分)的乘积形式来表示,这就是浮点数表示法。 同理,一个二进制数N也可以表示为N=±S×2±P的形式。 其中,N、S、P均为二进制数。S称为N的尾数,即全部的有效数字(数值小于1的纯小数),S前面的±是尾数的符号; P称为N的阶码(通常是整数),即指明小数点的实际位置,P前面的±是阶码的符号。 在计算机中一般浮点数的表示形式如图3.8所示。 图3.8浮点数的表示形式 在浮点数表示中,尾数的符号和阶码的符号各占一位,阶码是定点整数,阶码的位数决定了所表示的浮点数的范围,尾数是定点小数,尾数的位数决定了浮点数的精度。阶码和尾数都可以用补码表示。在字长有限的情况下,浮点数表示方法能扩大数的表示范围。 【例3.14】如果计算机的字长为8位,一个字长内,如果用定点整数形式,带符号数的表示范围为-128~+127(十进制数)。如果用浮点数形式,可以表示十进制数的+1537甚至更大的数。+1537写成浮点数形式如下: +1537=(11000000001)2≈0.11×21011 用一个8位字长表示,阶码数值位为1011,符号位为0,共5位; 尾数为11,符号位为0,共3位。合起来就是01011011B。 说明: ①由于字长的限制,尾数的数值位只有2位,因此原本的尾数0.11000000001,只能表示成0.11,所以01011011B是十进制数+1537的近似表示。浮点数表示方法能扩大数的表示范围,但精度有所损失。合理确定尾数和阶码分别所占位数,既能扩大数的表示范围,又能保证一定的精度。②从上面的介绍可以看出,整数表示和浮点数表示在计算机内部的存储格式是不一样的,所以在程序设计语言里一般都要求,不同类型的数据是不能直接运算的,需要先转换为同一类型,再进行计算。 3.4字符型数据的编码表示 计算机不仅能处理数值型数据,还能处理字符型数据,如英文字母、标点符号等。对于数值型数据,可以按照一定的转换规则将其转换为二进制数在计算机内部表示,但对于字符型数据,没有相应的转换规则可以使用。人们可以设计每个字符对应的二进制编码形式,但设计方案要科学、合理,才能得到业界广泛的认可和使用。当输入一个字符时,系统自动将输入的字符按规定的编码方式转换为相应的二进制形式存入计算机的存储单元中。在输出过程中,再由系统自动将二进制编码数据转换为用户可以识别的数据格式输出。 微课视频 常用的字符型数据编码方式主要有ASCII码、EBCDIC码等,前者主要用于微型计算机,后者主要用于超级计算机和大型计算机。 3.4.1ASCII码 目前微型计算机中使用最广泛的字符编码是ASCII码,即美国信息交换标准码(American Standard Code for Information Interchange)。ASCII码包括32个通用控制字符(最左边两列)、10个十进制数码、52个英文大小写字母和34个专用符号(标点符号等),共128个符号,故需要用7位二进制数进行编码。通常使用一个字节(8个二进制位)表示一个字符的ASCII码,规定其最高位总是0,后7位为实际的ASCII码。ASCII码如表3.3所示。 表3.37位ASCII码编码表 b4b3b2b1 b7b6b5 000 001 010 011 100 101 110 111 0000 NUL DLE SPACE 0 @ P ` p 0001 SOH DC1 ! 1 A Q a q 0010 STX DC2 " 2 B R b r 0011 ETX DC3 # 3 C S c s 0100 EOT DC4 $ 4 D T d t 0101 ENO NAK % 5 E U e u 0110 ACK SYN & 6 F V f v 0111 BEL ETB ' 7 G W g w 1000 BS CAN ( 8 H X h x 1001 HT EM ) 9 I Y i y 1010 LF SUB * : J Z j z 1011 VT ESC + ; K [ k { 1100 FF FS , < L \ l | 1101 CR GS - = M } m } 1110 SO RS . > N^ n ~ 1111 SI US / ? O_ o DEL 【例3.15】给出英文单词Computer的ASCII码。 查看表3.3可知,Computer中各字符的二进制形式的ASCII码分别为01000011、01101111、01101101、01110000、01110101、01110100、01100101、01110010,写成十六进制形式为43 6F 6D 70 75 74 65 72,存储在计算机中占用8字节单元,即1个字符占用1字节单元。 3.4.2EBCDIC码 EBCDIC(extended binary coded decimal interchange code) 码是对BCD码的扩展,称为扩展BCD码。BCD(binarycoded decimal) 码又称“二十进制编码”,用二进制编码形式表示十进制数。BCD码的编码方法很多,有8421码、2421码和5211码等。最常用的是8421码,其方法是用4位二进制数表示一位十进制数,自左至右每一位对应的位权分别是8、4、2、1。4位二进制数有0000~1111共16种状态,而十进制数只有0~9共10个数码,BCD码只用10种状态: 0000~1001。8421码如表3.4所示。由于BCD码中的8421码应用最广泛,因此一般说BCD码就是指8421码。 表3.48421码表 十 进 制 数 8421码 十 进 制 数 8421码 0 0000 8 1000 1 0001 9 1001 2 0010 10 0001 0000 3 0011 11 0001 0001 4 0100 12 0001 0010 5 0101 13 0001 0011 6 0110 14 0001 0100 7 0111 15 0001 0101 【例3.16】写出十进制数7852的8421 BCD码。 十进制数7852的8421BCD码为0111100001010010B,实际存储时可以占用4字节,每字节的高4位补0000,低4位存储一位十进制数的BCD码,7852对应的4字节BCD码值为00000111 00001000 00000101 00000010,即一位十进制数字占用一字节,称为非压缩BCD码; 也可以用2字节存储,7852对应的2字节BCD码值为01111000 01010010,即两位十进制数字占用一字节,称为压缩BCD码。 IBM公司于1963—1964年推出了EBCDIC码,除了原有的10个数字之外,又增加了一些特殊符号、大小写英文字母和某些控制字符的表示。所以,EBCDIC码也是一种字符编码,如表3.5所示,主要用于大型计算机和超级计算机。 表3.5EBCDIC码 高位 低位 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0000 NUL SCH STX ETX PF HT LC DEL RLF SMM VT FF CR SR SI 0001 DLE DC1 DC2 TM RES NL BS IL CAN EM CC CU1 IFS IGS IRS IUS 0010 DS SOS FS BYP LF ETB ESC SM CU2 ENQ ACK BEL 0011 SYN PN RS UC EQT GU3 DC4 NAK SUB 0100 SP [ 。 < ( + ! 0101 & ] $ * ) ; ~ 0110 - / | , % _ > ? 0111 _ : # @ ‘ = “ 1000 a b c d e f g h i 1001 j k l m n o p q r 1010 - s t u v w x y z 1011 1100 { A B C D E F G H I 1101 } J K L M N O P Q R 1110 \ S T U V W X Y Z 1111 0 1 2 3 4 5 6 7 8 9 3.5汉字的编码表示 汉字与英文字母类似,也没有可用的转换规则直接转换为二进制形式,也需要设计每个汉字对应的二进制编码,用于汉字在计算机中的表示与存储。汉字有一些与英文字母不同的特点,常用汉字的个数比较多,不能直接对应到键盘上(一个英文字母对应一个按键),所以还要设计汉字的输入编码,即每个汉字通过哪几个按键输入。输出汉字时,还需要汉字的字形码。即对于汉字来说,要设计用于输入汉字的输入码,用于存储汉字的机内码和用于输出汉字的字形码。 微课视频 3.5.1汉字输入码 在用计算机处理汉字时,首先遇到的问题是如何输入汉字。汉字输入码是指从键盘输入汉字时采用的编码,又称为外码,主要有数字码、拼音码和字形码等。 (1) 数字码。常用的数字码是国标区位码,用数字串代表一个汉字的输入码。区位码是将国家标准局公布的6763个常用汉字分为94个区,每个区再分为94位,实际上是把汉字和一些特殊符号组织在一个94行94列的矩阵中,每一行称为一个区,每一列称为一个位,共有94个区(区号为01~94),每个区内有94个位(位号也为01~94)。一个汉字所在的区号和位号组合在一起就构成了该汉字的区位码(4位十进制数字)。例如,“机”字位于第27区90位,区位码为2790。 (2) 拼音码。拼音码是以汉语拼音为基础的输入码,如搜狗拼音输入法、微软拼音输入法和QQ拼音输入法等。 (3) 字形码。字形码是根据汉字的形状形成的输入码。汉字个数虽多,但组成汉字的基本笔画和基本结构并不多。因此,把汉字拆分成基本笔画和基本结构,按笔画或基本结构的顺序依次输入,就能表示一个汉字。五笔字型编码是最有影响的一种字形码方法。 数字码的优点是每个汉字都有一个唯一的数字编码,不足是记忆量太大,一般人很难掌握。拼音码易于学习和掌握,凡熟悉汉语拼音的人,不需训练和记忆即可使用,但由于重码率高(好多字的拼音相同),难以实现盲打,导致打字速度不容易提高。字形码的拆字规则(把一个字拆成基本笔画或基本结构,再对应到键盘的按键上)较复杂,学习起来较为困难,但其重码率很低,一旦学会并熟练掌握,能够实现盲打,因而有比较快的输入速度。专业打字人员使用字形码(五笔字型)比较多,一般人使用拼音码比较多。 为了提高汉字输入速度,在上述方法的基础上,发展了词组输入、联想输入等多种快速输入方法。另外的输入方式是利用语音或图像识别技术实现语音输入和扫描输入,自动将文字输入计算机中。键盘输入、语音输入和扫描输入各有其特点及适用场景。 3.5.2汉字机内码 汉字机内码是指计算机内部存储和处理汉字时所用的编码,要求它与ASCII码兼容但又不能相同,以便实现汉字与英文的混合存储与处理。输入码经过键盘被计算机接收后就由有汉字处理功能的操作系统的“输入码转换模块”转换为机内码。机内码主要有国标码、Unicode编码等。 1. 国标码 1980年我国公布了GB 2312—1980《信息交换用汉字编码字符集·基本集》,简称国标码,规定每个汉字编码由2字节构成,定义了6763个常用汉字和682个图形符号。 为了进一步满足信息处理的需要,在国标码的基础上,2000年3月我国又推出了GB 18030—2000《信息技术信息交换用汉字编码字符集基本集的扩充》,共收录27533个汉字。GB 18030—2000采用变长多字节编码,每个汉字编码可以由2字节或4字节组成,完全支持Unicode编码,对GB 2312—1980完全向后兼容。 2005年发布的GB 18030—2005《信息技术中文编码字符集》以汉字为主并包含多种我国少数民族文字,收录汉字70244多个,相对于GB 18030—2000,增加了4万多个汉字。2022年发布的GB 18030—2022《信息技术中文编码字符集》收录汉字87887 个,又增加了1.7万多个汉字。 通常将国标码的每个字节的最高位置1作为汉字的机内码,国标码由2字节或4字节表示一个汉字。由于英文符号的ASCII码的最高位为0,而汉字符号的机内码的每字节的最高位都为1,因此易于区分出某个字节数据表示的是一个英文字符,还是汉字字符的组成部分。 2. Unicode编码 随着互联网的快速发展,需要满足跨语言、跨平台进行文本转换和处理的要求,还要与ASCII码兼容,因此,在1994年由统一码联盟发布了Unicode 1.0,到2022年的最新版本是Unicode 15.0。Unicode编码(统一码、万国码、单一码)试图为全世界每种语言中的每个字符设定统一并且唯一的二进制编码。Unicode编码的优点是包括了世界上所有语言的字符,但也有其不足。我们知道,英文字母只用1字节表示就够了,但如果用定长方式表示,每个符号的Unicode编码需要用4字节表示,那么每个英文字母的4字节编码中的3字节都是0,这对于存储空间来说是很大的浪费,文本文件的大小会因此大二三倍。 Unicode编码在很长一段时间内无法推广,直到互联网的出现。为解决Unicode编码字符如何在网络上传输的问题,于是面向网络传输的多种通用字符集传输格式(UCS transfer format,UTF)标准出现了,UCS是universal character set(通用字符集)的缩写形式。UTF8是在互联网上使用最为广泛的一种Unicode编码的实现方式,它每次可以传输8个数据位。变长编码方式是UTF8的最大特点,它使用1~4字节表示一个符号,根据不同的符号而变化字节长度。当字符在ASCII码的范围时,就用1字节表示,保留了ASCII字符1字节的编码作为它的一部分。UTF8的一个中文字符占用3字节。从Unicode编码到UTF8并不是直接对应的,要经过一些算法和规则的转换。 3.5.3汉字字形码 汉字字形码又称汉字字模,是指汉字信息的输出编码,用于汉字的显示或打印机输出。汉字字形码有两种主要表示方式: 点阵方式和矢量方式。汉字在计算机内部是以机内码的形式存储和处理的,当需要显示或打印这些汉字时,必须通过字形码将其转换为人们能看懂且能表示为各种字形字体的图形格式,然后通过输出设备输出。 1. 点阵字形码 不论一个字的笔画多少,都可以用一组点阵表示。每个点对应二进制的一位,由0和1表示不同状态,如黑白颜色等。一种字形码的全部汉字编码就构成字模库,简称字库。根据输出字符要求的不同,每个字符点阵中点的个数也不同。点阵越大,点数越多,输出的字形也就越清晰美观,占用的存储空间也就越大。汉字字形有16×16、24×24、32×32、48×48、128×128点阵等,不同字体的汉字需要不同的字库。点阵字库存储在文字发生器或字模存储器中。字模点阵的信息量是很大的,所占存储空间也很大。以早期显示用的16×16点阵为例,每个汉字的字形编码要占用32字节。打印一般用24×24点阵形式,每个汉字就要占用72字节。对于128×128点阵形式,每个汉字就要占用2048字节,将导致整个字库占用大量的存储空间。图3.9所示是汉字“英”的点阵及对应编码。 图3.9汉字“英”的点阵及对应编码 2. 矢量字形码 对于矢量方式的字形码,在计算机内存储的是一种用数学函数描述的曲线字库,采用了几何学中二次曲线及直线来描述字体的外形轮廓,含有字形构造、颜色填充、数字描述函数、流程条件控制、栅格处理控制、附加提示控制等指令。当要输出汉字时,通过计算机的计算,由汉字字形描述生成所需大小和形状的汉字。由于是用指令对字形进行描述,与分辨率无关,均以设备的分辨率输出,既可以屏幕显示,又可以打印输出,字符缩放时总是光滑的,不会有锯齿出现,因此可产生高质量的汉字输出。 图3.10点阵汉字与矢量汉字放 大后的输出效果对比 点阵方式和矢量方式各有特点。前者编码、存储方式简单,无须转换直接输出,字号变大后显示或打印效果变差,出现锯齿笔画甚至模糊不清; 后者输出时需要进行转换,输出过程复杂一些,但字号变大后不会降低显示或打印质量。点阵汉字和矢量汉字放大后的输出效果对比如图3.10所示。 汉字通常通过输入码输入计算机内,再由汉字系统的输入管理模块通过查表或计算,将输入码(外码)转换为机内码存入计算机存储器中,对汉字的处理也是以机内码形式进行的。当存储在计算机内的汉字需要在屏幕上显示或在打印机上输出时,要借助汉字机内码在字模库中找出对应的字形码,在输出设备上将该汉字的图形信息显示或打印出来。 3.6图像与声音数据的采集与表示 计算机能够存储和处理的信息,除了前面介绍的数值和文本(如英文字符、汉字等)外,还有图形、图像、音频、视频、动画等多媒体信息,而且随着计算机技术、网络技术的快速发展和应用的普及,生动形象、深受人们喜欢的音/视频信息越来越多。 图像和声音都不能通过键盘输入计算机,而是通过信息采集设备(如数码相机、带摄像头的手机、录音笔、扫描仪等)变为二进制信息并存储的。 微课视频 3.6.1图像数据的采集与表示 1. 图形 图形(graphic)一般指用计算机绘制的几何形状,如直线、圆、圆弧、矩形、任意曲线和图表等,也称矢量图。 图形以矢量图形文件的形式存储,计算机中存储的是生成图形的指令,所以一般不需要对矢量图进行编码。计算机中常用的矢量图形文件有.3ds文件(用于三维造型)、.dxf文件(用于计算机辅助设计)、.wmf文件(用于桌面出版)等。 2. 图像 图像(image)又称位图(bitmap)或图片,是指由输入设备捕捉的实际场景画面,或以数字化形式存储的任意画面,如用手机拍摄的数码照片、扫描仪扫描的图片等。手机摄像头或扫描仪把图像点阵化,每个点称为像素(pixel)。类似于汉字的点阵,不同的是分辨率更高一些,目前一般都在1024×1024像素以上,采集的值为像素点的颜色,对于彩色图像,一般用24位二进制数表示一个像素点的颜色值,一共可以表示224(16777216)种不同的颜色,基本可以把人眼能识别的所有不同颜色表达出来,称为真彩色。BMP格式的图像文件保存原始像素数据,即每个像素点的颜色值。对于一幅分辨率为1024×1024像素的真彩色图片,其BMP文件的大小为3MB。JPG格式为一种压缩格式。除BMP、JPG格式外,图像文件还有GIF、PNG、PCX、TIF、TGA等格式。 3. 视频 视频是视频图像(video)的简称,是一种活动影像,它与电影和电视原理是一样的,都是利用人眼的视觉暂留特征,将足够多的静态画面(frame,帧)连续播放,只要能够达到每秒24帧以上,人的眼睛就察觉不出画面之间的不连续性。视频文件在计算机中的存储格式有AVI、WMV、MPEG、ASF、RM、MOV等。 视频文件存储的是视频所包含的所有图像的数据。 4. 动画 动画(animation)也是一种活动影像,最典型的是“卡通”片。动画也称为动漫,它与视频的不同在于视频一般是指对自然界真实影像的记录,如用摄像机拍摄下来的自然风光,而动画通常指人工制作出来的连续图像或图形所组合成的动态影像。动画文件存储的是动画所包含的所有(“卡通”)图像的数据。 3.6.2声音数据的采集与表示 声音也称为音频(audio),声音(声波)是通过空气传播的一种连续的波。声音有多种,如人说话、唱歌的声音,演奏乐器的声音,刮风、下雨、打雷的声音等。声音一般用一种模拟的连续波形表示,如图3.11所示。声波可以用振幅和频率两个参数来描述,振幅的大小反映了声音的强弱,用分贝(dB)表示; 频率是指声音信号每秒变化的次数,频率的大小反映了音调的高低,用赫兹(Hz)表示。 对声音的数字化就是对声波采样和量化,即按一定的时间间隔对声波的振幅进行测量并转换为二进制数,如图3.12所示。 采样频率越高(采样时间间隔越小)、采样精度越高(表示振幅值的二进制位数越多),就越能真实地把声音记录下来(播放时质量高),当然,需要的存储容量也就越大。 例如,每秒采样40000次,用16个二进制位表示采样值,可以把采样值量化为65536个级别,采样一秒钟产生的数据为: 40000×16/8B=80000B=78.125KB。 音频文件在计算机中的存储格式有MP3、WAV、MIDI、WMA等。 图3.11声音波形 图3.12声音的采样和量化 3.7小结 计算机能够处理数值、文本、图形、图像、视频、动画和音频等多种媒体信息,虽然展现的这些信息千姿百态、异彩纷呈,但所有信息在计算机内部都是以二进制数据形式存储的。 数值、文本、图形、图像、视频、动画和音频以不同的方式转换为二进制形式。数值按一定的规则转换为对应的二进制数,文本(如英文字符、汉字等)按设计好的编码规则得到对应的二进制数(如ASCII码、EBCDIC码、汉字国标码、Unicode编码等),图形对应的是生成图形的指令,图像和声音通过采集设备获取对应的二进制数,图像对应的是点阵数据,声音得到的是声波的量化数据。作为计算机专业的学生,明晰各种信息到二进制数据的转换与存储,了解数值的符号与小数点如何在计算机内部表示,对于深入理解计算机的工作原理、深入理解程序设计时的一些要求都是非常有益的。 拓展阅读: Intel公司与CPU Intel(英特尔)公司成立于1968年,名字取自两个英文单词Integrated(集成)和Electronic(电子)的组合,当时公司只有8个人。罗伯特·诺伊斯(R. Noyce,1927—1990)、戈登·摩尔(G. Moore,1929—)和安迪·葛洛夫(A. Grove,1936—)是公司的主要创始人并领导公司在微处理器领域取得了辉煌的成就。信息技术(information technology,IT)领域著名的摩尔定律就是由摩尔提出的,定律的内容是“集成电路上可容纳的晶体管个数,约每隔18个月便会增加一倍,性能也将提升一倍”。 Intel公司的早期产品主要是存储器,用半导体存储器取代了磁芯存储器,大大提高了存储容量和数据存取速度。1971年,当时还处在早期发展阶段的Intel公司推出了世界上第一枚微处理器4004,这是第一个用于计算器的4位微处理器。4004含有2300个晶体管,现在看来功能有限,速度也不快。但是,辉煌成就就是从这开始的,从此以后,Intel公司逐步占据微处理器市场的霸主地位。1972年推出8位的8008,1974年推出比8008更先进的8080。 1978年,首次生产出名为8086的16位微处理器,同时生产了与之相配合的数字协处理器8087,在8087指令集中增加了一些专门用于对数、指数和三角函数等数学计算的指令,以提高数学运算的速度。由于这些指令集应用于8086和8087,因此人们也把这些指令集统一称为x86指令集。虽然以后Intel公司又陆续生产出第二代、第三代等若干代更先进和更快速的新型微处理器,但都兼容原来的x86指令,而且Intel公司在后续微处理器的命名上沿用了原先的x86序列,直到后来因商标注册问题,才放弃了继续使用阿拉伯数字命名的做法,新起名为“奔腾”(Pentium)。 1979年,Intel公司推出了8088芯片,属于准16位微处理器,内部数据总线是16位,外部数据总线是8位,内含29000个晶体管,时钟频率为4.77MHz,地址总线为20位,可使用1MB内存。 1981年,8088芯片首次用于IBM PC中,使微型计算机的发展进入了一个新的时代。也正是从8088开始,PC的概念开始在全世界范围内流行起来。 1982年,Intel公司推出了新产品80286芯片,该芯片比8086和8088都有很大的改进,虽然它仍旧是16位结构,但是在CPU的内部含有13.4万个晶体管,时钟频率由最初的6MHz逐步提高到20MHz。其内部和外部数据总线均为16位,地址总线为24位,寻址能力扩大到16MB内存。从80286开始,CPU的工作方式也变成实模式和保护模式两种方式。 1985年,Intel公司推出了80386芯片,它是80x86系列中的第一款32位微处理器,而且制造工艺也有了很大的进步,80386内部集成有27.5万个晶体管,时钟频率为12.5MHz,后提高到20MHz、25MHz、33MHz几个档次。80386的内部和外部数据总线都是32位,地址总线也是32位,可寻址高达4GB的内存。它除具有实模式和保护模式外,还增加了一种叫虚拟86的工作方式,可以通过同时模拟多个8086处理器来提供多任务处理能力。 1989年,Intel公司推出80486芯片,80486是将80386和数字协处理器80387以及一个8KB的高速缓存(cache)集成在一个CPU芯片内,这种芯片集成了120万个晶体管。80486的时钟频率从25MHz逐步提高到33MHz、50MHz,并且在80x86系列中首次采用了精简指令集计算机(reduced instruction set computing,RISC)技术,可以在一个时钟周期内执行一条指令。它还采用了突发总线方式,大大提高了与内存的数据交换速度。由于这些改进,80486的性能比带有80387数字协处理器的80386提高了4倍。 Intel公司于1993年推出了全新一代的高性能处理器80586。由于CPU市场的竞争越来越激烈,提出了商标注册问题,但美国法律不允许用阿拉伯数字注册商标,于是Intel公司用新的名字——Pentium注册了商标。Pentium中的Pent来自希腊语,意思是5,ium使芯片看起来像基本元素(确实是组成计算机系统的基本元素)。Intel公司还给它起了一个非常好听的中文名字——“奔腾”。Pentium内部集成的晶体管数量高达310万个,时钟频率由最初的60MHz和66MHz,逐步提高到200MHz。66MHz的Pentium比33MHz的80486要快3倍多。 1995年,Intel公司推出了第6代x86系列CPU——Pentium Pro。Pentium Pro内部集成有550万个晶体管,内部时钟频率为133MHz,处理速度大约是100MHz的Pentium的2倍。Pentium Pro的一级(片内)缓存为8KB指令和8KB数据。在Pentium Pro的一个封装中除Pentium Pro芯片外,还包括有一个256KB的二级缓存芯片。 1996年,Intel公司又推出了Pentium系列的改进版本——多能奔腾(Pentium MMX)。MMX技术是Intel公司发明的一项多媒体增强指令集技术,为CPU增加了57条MMX指令,还将CPU芯片内的一级缓存由原来的16KB增加到32KB(16KB指令+16KB数据),MMX CPU比普通CPU在运行含有MMX指令的程序时,处理多媒体的能力提高了60%左右。 1997年5月,Intel公司又推出了Pentium Ⅱ。Pentium Ⅱ采用了与Pentium Pro相同的核心结构,但它加快了段寄存器写操作的速度,并增加了MMX指令集,以加快16位操作系统的执行速度。Pentium Ⅱ比Pentium Pro多集成了200万个晶体管。 1998年,Intel公司推出了面向低端市场、性能价格比较高的赛扬处理器(Celeron CPU)。该处理器去掉了二级缓存,因而可以降低处理器的成本。 1998—1999年,Intel公司还推出一款比Pentium Ⅱ功能还要强大的至强处理器(Xeon CPU)。至强处理器的目标就是挑战高端的、基于RISC的工作站和服务器。赛扬处理器和至强处理器的推出就是要全方位占领微处理器市场,满足各种不同用户的需要。 Pentium Ⅲ处理器是Intel公司的又一代产品,内部集成了960万个晶体管,拥有32KB一级缓存和512KB二级缓存,增加了能够增强音频、视频和三维图形效果的数据流单指令多数据扩展(streaming SIMD extensions,SSE)指令集,和Pentium Ⅱ Xeon一样,Intel公司也推出了面向服务器和工作站系统的高性能CPU——Pentium Ⅲ Xeon。最初发布的Pentium Ⅲ有450MHz和500MHz两种规格。 1999年10月底,Intel公司正式发布代号为Coppermine的新一代Pentium Ⅲ处理器,CPU主频最高达到733MHz。Coppermine采用全新的核心设计,内置256KB与CPU主频同步运行的二级缓存,新一代的Coppermine处理器的集成度大为提高,它的核心集成了2800万个晶体管。CPU芯片可以做得更小,从而使芯片面积更小,功耗大为减小,成本也得以降低。所以,该款CPU适用于笔记本计算机使用。 2000年11月,Intel公司推出了功能更为强大的Pentium 4。Pentium 4采用了Intel的NetBurst技术,与Pentium Ⅲ相比,Pentium 4体系结构的流水线深度增加了一倍,达到了20级,集成了4200万个晶体管,时钟频率高达1.4GHz和1.5GHz。改进的浮点运算功能使Pentium 4提供更加逼真的视频和三维图形,带来更加精彩的游戏和多媒体享受。算术逻辑单元以双倍的时钟速度运行,从而提高了总体运算速度。 2003年,Intel公司发布了专门用于移动运算的Pentium M处理器。Pentium M处理器结合了855芯片组与Intel PRO/Wireless 2100网络联机技术,成为Centrino(迅驰)移动运算技术的最重要组成部分。 2005年,Intel公司推出了双核心处理器Pentium D和Pentium Extreme Edition,同时推出945/955/965/975芯片组来支持新推出的双核心处理器。 2006年7月,Intel公司发布了酷睿2(Core 2 Duo),酷睿2是一个跨平台的构架体系,包括服务器版、桌面版、移动版三大领域。 2010年6月,Intel公司发布了Core i3/i5/i7,Core i3/i5/i7基于全新的sandy bridge微架构,具有更低的功耗、更高的性能、更强的浮点运算与加密解密运算能力。2012年4月,Intel公司发布了ivy bridge(IVB)处理器。2013年6月,Haswell CPU问世。2017年5月,Intel公司发布了Core i9处理器,Core i9最多可包含18个内核,主要面向游戏和高性能需求。2023年,Intel公司推出了第13代Core i5、i7、i9 CPU,13代Core i513600KF CPU拥有14 核心20线程,睿频最高可达5.1GHz,24MB的L3和20MB L2高速缓存。13代Core i713700KF CPU拥有16核心24线程,睿频最高可达5.4GHz,30MB 的 L3和 24MB L2高速缓存。13代Core i913980HX CPU拥有 24个内核,包括 8个性能核和16个能效核,性能核的睿频可达5.6GHz,能效核的睿频可达4GHz。 在高性能的微处理器研发中使用了超线程技术和多核技术。超线程技术(hyper threading technology)就是利用特殊的硬件指令,把处理器内部的两个逻辑内核模拟成两个物理芯片,从而使单个处理器能够使用线程级的并行计算。多线程技术可以在支持多线程的操作系统和软件上,有效地增强处理器在多任务、多线程处理上的处理能力。对于单线程芯片来说,虽然也可以每秒处理成千上万条指令,但是在某一时刻,只能够对一条指令(单个线程)进行处理,而超线程技术则可以使处理器在某一时刻,同步并行处理更多指令和数据。多核技术指在一个处理器上集成多个运算核心,从而提高处理器的计算能力。 Intel公司除了传统的微处理器、芯片组、板卡市场外,近几年在向可穿戴设备、人工智能领域拓展,2023年营业收入为542亿美元。 习题3 一、 填空题 1. 在计算机内部用进制存储程序和数据。 2. 对于十六进制,所用数码除了0~9外,还有 。 3. 用后缀区分不同进制时,二、十、八、十六进制的后缀分别为、、、。 4. 把一个十进制数转换为二进制数,整数部分采用,小数部分采用。 5. 在计算机内部将数值型数据(真值)全面、完整地表示成一个二进制数(机器数),需要考虑4个因素: 、、、。 6. 在计算机内部表示浮点数,包括4部分: 、、、。 7. ASCII码共包括个符号。 8. ASCII码主要用于,EBCDIC码主要用于和。 9. 用计算机处理汉字,一般要考虑码、码、码的设计。 10. 汉字的字形码分为 字形码、字形码。 11. 影响电子图片数据量大小的主要因素有 和 。 12. 影响采集声音数据量大小的主要因素有 和 。 二、 计算题 1. 分别将下列数值转换为二进制数(小数点后保留4位)。 (216.73)10(7563.42)8(1A4E.3B)16 2. 分别将下列二进制数转换为十进制数、八进制数和十六进制数。 (101101111.10111)2 (10110110.110111)2 3. 分别将下列十进制数转换为八进制数和十六进制数。 (175.25)10(357)10 4. 字长为8位时,分别求(+62)10和(-62)10的原码、反码和补码。 5. 计算十进制数37-59的值,先把十进制数转换为二进制数,然后用补码计算,并体会补码的作用。 三、 简答题 1. 简要说明汉字的输入码、机内码和输出码的作用。 2. 对比说明数值、英文字符、汉字、图像和声音是如何转换为二进制数据的。 思 考 题 3 1. 对比说明带符号整数和实数在计算机内部的不同存储格式。 2. 既要表示世界上所有的语言文字,又要尽可能少占用存储空间,Unicode编码是如何处理这个关系的?