1.3 计算机内的信息表示
在计算机中,各种信息都是以二进制数的形式表示的,这是由计算机电路所采用的元器件决定的。计算机中采用了具有两个稳定状态的二值电路:用“0”表示低电位,“1”表示高电位。采用这种进位制具有运算简单、电路实现方便、成本低的特点。
1.3.1 数制及其特点
日常生活中人们使用十进制数,计算机采用二进制数,但为了书写方便,也采用八进制或十六进制形式表示,下面介绍数制的基本概念。
各种进位计数值都可统一表示为下面的形式:
式中,R表示进位计数制的基数,在十进制、二进制、八进制、十六进制中R的值分别为10、2、8、16;
i表示位序号,个位为0,向高位(左边)依次加1,向低位(右边)依次减1;
a i表示第i位上的一个数符,其取值范围为0~R −1;
R i表示第i位上的权;
m和n表示最低位和最高位的位序号。
一切进位计数制都有两个基本特点:按基数进、借位,用位权值来计数。
所谓按基数进、借位,就是在执行加法或减法时,要遵循“逢R进一,借一当R”的规则。
因此,R进制的最大数符为R−1,而不是R,每个数符只能用一个字符表示。
1.十进制(Decimal System)
十进制的基数为10,它有10个数符:0,1,2,…,8,9。逢十进一,各位的权是以10为底的幂,书写时数字用括号括起来,再加上下标10。对十进制,下标通常省略不写。也可以在数字后加字母D表示(通常省略不写)。
【例】345.56 = (345.56)10= 3×102+ 4×101+ 5×100+ 5×10−1+ 6×10−2。
2.二进制(Binary System)
二进制的基数为2,只有2个数符:0,1。二进制数逢二进一,各位的权是以2为底的幂,书写时数字用括号括起来,再加上下标2。也可以在数字后加字母B表示。
【例】(11101.101)2= 1×24+ 1×23+ 1×22+0×21+ 1×20+ 1×2−1+ 0×2−2+ 1×2−3。
3.八进制(Octare System)
八进制的基数为8,它有8个数符:0,1,2,…,6,7。八进制数逢八进一,各位的权是以8为底的幂,书写时数字用括号括起来,再加上下标8。也可以在数字后加字母O表示。
【例】(753.65)8= 7×82+ 5×81+ 3×80+ 6×8−1+ 5×8−2。
4.十六进制(Hexadecimal System)
十六进制的基数为16,它有16个数符:0,1,2,…,8,9,A,B,C,D,E,F。十六进制数逢十六进一,各位的权是以 16 为底的幂,书写时数字用括号括起来,再加上下标 16。也可以在数字后加字母H表示。
遵循每个数符只能用一个字符表示的原则,在十六进制中对值大于9的6个数(即10~15)分别借用A~F 6个字母来表示。
【例】(A85.76)16= 10×162+ 8×161+ 5×160+ 7×16−1+ 6×16−2。
八进制或十六进制经常用在汇编语言程序或显示存储单元的内容显示中。
1.3.2 不同数制之间的转换
1.二进制、八进制、十六进制转换为十进制
若要将二进制、八进制、十六进制数转换为十进制数,可以按照求和的形式容易地计算出相应的十进制数。
【例】
(11101.101)2= 1×24+ 1×23+ 1×22+ 0×21+ 1×20+ 1×2−1+ 0×2−2+ 1×2−3= 29.625
(753.65)8= 7×82+ 5×81+ 3×80+ 6×8−1+ 5×8−2= 491.828 125
(A85.76)16= 10×162+ 8×161+ 5×160+ 7×16−1+ 6×16−2= 2 693.460 937 5
2.十进制转换为二进制、八进制、十六进制
将十进制数转换为二进制、八进制、十六进制数,其整数部分和小数部分的转换规则如下。
整数部分:用除R(基数)取余法则(规则:先余为低,后余为高)。
小数部分:用乘R(基数)取整法则(规则:先整为高,后整为低)。
【例】将(29.625)10转换为二进制表示。
a.用“除2取余”法先求出整数29对应的二进制数。
b.用“乘2取整”法求出小数0.625对应的二进制数。
由此可得(29.625)10= (11101.101)2
3.二进制与八进制、十六进制之间的转换
从23= 8、24= 16可以看出,每位八进制数可用3位二进制数表示,每位十六进制数可用4位二进制数表示,如表1-1和表1-2所示。
表1-1 二进制与八进制之间的转换
表1-2 二进制与十六进制之间的转换
① 八进制、十六进制转换为二进制。
只要把每位的八进制数或十六进制数展开为3位或4位二进制数,最后去掉整数首部的0或小数尾部的0即可。
【例】(753.65)8=111 101 011.110 101 将每位展开为3位二进制数
=(111101011.110101)2 转换后的二进制数
(A85.76)16=1010 1000 0101.0111 0110 将每位展开为4位二进制数
=(101010000101.0111011)2 去掉尾部的“0”
② 二进制转换为八进制、十六进制。
以小数点为中心,分别向左、右每3位或4位分成一组,不足3位或4位的则以“0”补足,然后将每个分组用一位对应的八进制数或十六进制数代替即可,这就是转换为八进制或十六进制的结果。
【例】(11101.101)2=011 101.101 每3位分成一组
=(35.5)8 转换后的结果
(11101.101)2=0001 1101.1010 每4位分成一组
=(1D.A)16 转换后的结果
1.3.3 计算机中字符的表示方法
字符包括英文字符(字母、数字、各种符号)和中文字符,由于计算机采用二进制,因此字符也必须按特定的规则进行二进制编码才能进入计算机。字符编码时首先要确定编码的字符总数,然后将每一个字符按顺序确定序号(序号的大小无意义,仅作为识别与使用这些字符的依据)。字符的多少涉及编码的位数。中英文采用不同的编码。
1.ASCII码
ASCII(American Standard Code for Information Interchange,美国标准信息交换码)是被国际标准化组织所采用的计算机在相互通信时共同遵守的标准。ASCII有两种:7位ASCII码和8位ASCII码,前者称为标准ASCII码,后者称为扩展ASCII码。7位ASCII码如表1-3所示。
表1-3 7位ASCII编码表
续表
从表1-3可以看出,ASCII码共包含27= 128个不同的编码,也就是128个不同的字符。其中,前32个和最后一个为控制码,是不可显示或打印的,主要用于控制计算机某些外围设备的工作特性和某些计算机软件的运行情况。例如,CR(Carriage Return)称为回车字符,是换行控制符;BEL(Bell Character)称为报警字符,是通信用的控制字符,可以作为报警装置或类似的装置发出报警的信号。其余95个为可打印/显示字符(但空格也是看不见的,因此实际可打印/显示的字符为94个),包括英文大小写字母52个, 0~9共10个数字,标点符号、运算符号和其他符号共33个。
ASCII码表中的可打印字符在键盘上都可以找到。在按键时,一方面,显示器上显示出相应的字符;另一方面,该字符的ASCII码将输入存储器中等待用户的处理。
计算机中字符的处理实际上是对字符ASCII码进行的处理。例如,比较字符“B”和“G”的大小实际上是对“B”和“G”的ASCII码66和71进行比较。输入字符时,该键所对应的ASCII码即存入计算机。将一篇文章输入完成后,计算机中实际存放的是一串ASCII码。
2.汉字的编码
汉字为非拼音文字,不可能像英文那样一字一码,显然汉字编码比英文编码要复杂得多。
(1)汉字交换码
1981年我国颁布实施了GB 2312—1980《信息交换用汉字编码字符集 基本集》。该标准规定用16位二进制表示一个汉字,每个字节只使用低7位(与ASCII码相同),即有128×128=16384种状态。由于ASCII 码中的 34 个控制码在汉字系统中也要使用,为不致发生冲突,不能作为汉字编码,也就是剩下 94种,所以汉字编码表的大小是94×94=8836,用来表示国标中规定的7445个汉字和图形符号(该标准收录6 763个常用汉字,包括一级汉字3 755个,按汉语拼音排序;二级汉字3 008个,按偏旁部首排序;以及英、俄、日文字母与其他符号682个)。
每个汉字或图形符号分别用两位的十进制区码(行码)和两位的十进制位码(列码)表示,不足的地方用0补上,组合起来就是区位码。区码或位码的范围都为1~94,这与基本ASCII码相冲突(基本ASCII码使用的是33~126),因此把区码和位码都加上20H(也就是32)。这样转换成的二进制代码称为信息交换码(简称国标码),即:
国标码高位字节=区码+20H
国标码低位字节=位码+20H
也就是每个汉字或符号都用两个字节表示,其中每个字节的编码从20H~7EH,即十进制的33~126。
国标码字符集的划分如表1-4所示。
表1-4 国标码字符集的划分
随着Internet的发展,国家信息标准化委员会于2000年3月17日公布了GB18030—2000《信息技术、信息交换用汉字编码字符集基本基的扩充》。该标准共收录了 27 000 多个汉字,可以满足人们对信息处理的需要。
(2)汉字机内码
计算机既要处理中文,又要处理西文,因此通常利用字节的最高位区分某个码值代表汉字(最高位为1)还是代表 ASCII 码(最高位为 0)。汉字的机内码在国标码的基础上,把两个字节的最高位一律由“0”改为“1”,也就是汉字机内码与国标码的关系为
汉字机内码高位字节=国标区位码高位字节+80H。
汉字机内码低位字节=国标区位码低位字节+80H。
(3)汉字外码(输入码)
英文的输入码与机内码是一致的,而汉字输入码是指直接从键盘输入的各种汉字输入法的编码,如区位码、拼音码、五笔字型码等,它与机内码是不同的。不同的汉字输入方法其输入编码是不同的,但存入计算中的必须是它的机内码,与采用的输入法无关。各种输入法的编码称为外码。
(4)汉字字型码
汉字字型码又称字模,用于汉字在显示器显示或打印机输出。汉字字型码通常有两种表示方式:点阵和矢量表示方法。
用点阵表示字型时,汉字字型码指的是这个汉字字型点阵的代码。根据输出汉字的要求不同,点阵的多少也不同。简易型汉字为16×16点阵,提高型汉字为24×24点阵、32×32点阵、48×48点阵等。点阵规模越大,字型越清晰美观,所占存储空间也越大。例如,一个16×16点阵占用的存储空间为32字节(2×16×8 = 32×8),一个24×24点阵占用的存储空间为72字节(3×24×8 = 72×8)。
矢量表示方式存储的是描述汉字字型的轮廓特征,当要输出汉字时,通过计算机的计算,由汉字字型描述生成所需大小和形状的汉字点阵。矢量化字型描述与最终文字显示的大小及分辨率无关,因此可以产生高质量的汉字输出。Windows中使用的TrueType技术就是汉字的矢量表示方式。
1.3.4 二进制数的运算
二进制数在计算机中可进行算术运算和逻辑运算。
1.算术运算
下面是二进制数算术运算的规则。
加法:0+0=0 1+0=0+1=1 1+1=10
减法:0−0=0 10−1=1 1−0=1 1−1=0
乘法:0×0=0 0×1=1×0=0 1×1=1
除法:0/1=0 1/1=1
2.逻辑运算
(1)或运算:“∨”“+”
规则:0∨0=0 0∨1=1 1∨0=1 1∨1=1
在或运算中,当两个逻辑值有一个为1时,结果就为1,否则为0。
【例】要得到成绩X不及格(小于60分)或者Y优秀(大于90分)的分数段人数,可用或运算表示为
(X<60)∨(Y>90)
(2)与运算:“∧”“· ”
规则:0∧0=0 0∧1=0 1∧0=0 1∧1=1
在与运算中,当两个逻辑值都为1时,结果才为1,否则为0。
【例】若合格产品的标准需控制在200~300,要判断某一产品质量参数X是否合格,可用与运算表示为
(X>200)∧(X<300)
(3)非运算:“ˉ”
在非运算中,对每位的逻辑值取反。
规则:0=1 1=0
【例】1011=0100
(4)异或运算:“⊕”
规则:0⊕0=0 0⊕1=1 1⊕0=1 1⊕1=0
在异或运算中,当两个逻辑值不相同时,结果为1,否则为0。
1.3.5 数值在计算机中的表示及运算
1.二进制数的原码、补码和反码表示
计算机中使用二进制数,所有的符号、数的正负号都是用二进制数值代码表示的。在数值的最高位用“0”和“1”分别表示数的正、负号。一个数(包括符号)在计算机中的表示形式称为机器数。机器数有3种表示法:原码、补码和反码。机器数将符号位和数值位一起编码,机器数对应的原来数值称为真值。
(1)原码表示法
在原码表示方法中,数值用绝对值表示,在数值的最左边用“0”和“1”分别表示正数和负数,写作[X]原。
【例】在8位二进制数中,十进制数+22和−22的原码表示为
[+22]原= 00010110
[−22]原= 10010110
应注意,0的原码有两种表示,分别是“00……0”和“10……0”,都作0处理。
(2)补码表示法
一般在做两个异号的原码加法时,实际上是做减法,然后根据两数的绝对值的大小来决定符号。能否统一用加法来实现呢?如对一个钟表,将指针从6拨到2,可以顺拨8,也可以倒拨4,用数学式子表示就是:6 + 8 − 12= 2和6 − 4= 2。
这里的12称为钟表的“模”。8与−4对于模12来说互为补数。计算机中是以2为模对数值做加法运算的,因此可以引入补码,把减法运算转换为加法运算。
求一个二进制数补码的方法:正数的补码与其原码相同;负数的补码是把其原码除符号位外的各位先求其反码,然后在最低位加1。通常用[X]补表示X的补码,+4和−4的补码表示为
[+4]补= 00000100
[−4]补= 11111100
(3)反码表示法
正数的反码等于这个数本身,负数的反码等于其绝对值各位求反(符号位除外)。
【例】[+12]反=00001100 [−12]反=11110011
总结以上规律,可得到如下公式:X − Y = X + (Y的补码)= X + (Y的反码+1)
2.定点数和浮点数
在计算机中,一个数如果小数点的位置是固定的,则称为定点数,否则称为浮点数。
(1)定点数
定点数一般把小数点固定在数值部分的最高位之前,即在符号位与数值部分之间,或把小数点固定在数值部分的最后面。前者将数表示成纯小数,后者把数表示成整数。
(2)浮点数
浮点数是指在数的表示中,其小数点的位置是浮动的。任意一个二进制数N可以表示为
N = M×2E
其中,E是一个二进制整数,M是二进制小数,这里称E为数N的阶码,M称为数N的尾数,M表示了数N的全部有效数字,阶码E指明了小数点的位置。
在计算机中,一个浮点数的表示分为阶码和尾数两个部分,格式如下:
其中,阶码确定了小数点的位置,表示数的范围;尾数则表示数的精度;尾符也称数符。浮点数的表示范围比定点数大得多,精度也高。
从以上介绍中可知,计算机是采用二进制数存储数据和进行计算的,引入补码可以把减法转换为加法,简化了运算;使用浮点数扩大了数的表示范围,提高了数的精度。