1.1 计算机中的信息及表示
计算机是能够对输入的信息进行加工处理、存储并能按要求输出结果的电子设备,又称电脑或信息处理机。计算机中处理的信息,主要有数值信息和非数值信息两大类。数值信息是指日常生活中接触到的数字类数据,主要用来表示数量的多少,可以比较大小;非数值信息有多种,有用来表示文字信息的字符数据,也有用来表示图形、图像和声音等其他信息的数据。不同的信息在计算机中的表示形式不一样。从计算机内部角度来说,由于计算机内部只能识别二进制数,因此所有信息在计算机内都通过二进制编码表示。
1.1.1 数在计算机内的表示
计算机中的数通常有两种:无符号数和有符号数。两种数在计算机中的表示是不一样的。
1.无符号数在计算机内的表示
无符号数不带符号,表示时比较简单,在计算机中一般直接用二进制数的形式表示,位数不足时前面加0补充。对一个n位二进制数,它能表示的无符号数的范围是0~2n-1。例如,假设机器字长8位,无符号数156在计算机中表示是10011100B,45在计算机中表示是00101101B。
2.有符号数在计算机内的表示
有符号数带有正负号。数学上用正负号来表示数的正负。由于计算机只能识别二进制符号,不能识别正负号,因此计算机中只能将正、负号数字化,用二进制符号表示。在计算机中表示有符号数时,一般用二进制数的最高位来表示符号,正数表示为0,负数表示为1,称为符号位;其余位用来表示有符号数的数值大小,称为数值位。通常,把一个数及其符号位在计算机中的二进制数的表示形式称为“机器数”。机器数所表示的值称为该机器数的“真值”。机器数的表示如图1.1所示。
机器数通常有3种表示方法:原码表示法、反码表示法和补码表示法。为了运算方便,计算机中通常用补码表示。为了研究补码表示法,首先了解原码表示法和反码表示法。
(1)原码
原码表示方法如下:最高位为符号位,用0表示正数,用1表示负数,数值位用数的绝对值表示,数值位如位数不足前面加0填充。由于正数的符号位为0,因而正数的原码表示与相应的无符号数的表示相同。原码的表示如图1.2所示。
图1.1 机器数的表示
图1.2 原码的表示
【例1-1】 求+78、-23的原码(设机器字长8位)。
因为
|+78|=78=1001110B
|-23|=23=10111B
所以
[+78]原=01001110B
[-23]原=10010111B
原码表示时,如果机器字长为n位二进制数,其原码表示的有符号数范围为-(2n-1-1)~+(2n-1-1)。例如,如果机器字长为8位二进制数,则表示的有符号数范围为-127~+127。
另外,“0”的原码表示有两个,-0和+0的编码不一样。假设机器字长为8位,-0的编码为10000000B,+0的编码为00000000B。
原码表示简单直观,且与真值的转换很方便,但不便于在计算机中进行加减运算,运算时符号位与数值位必须分开处理。两数相加时,必须先判断两个数的符号是否相同。如果相同,则符号位不变,对数值位相加得结果数值位;如果符号位不同,则应将数值位相减,数值位相减时,必须比较两数的数值位大小,再由大数减小数得结果的数值位,而结果的符号位要和数值位大的数的符号位一致。两数相减时情况类似。按上述运算方法设计的运算电路很复杂。为运算方便,后来计算机中引入了反码表示和补码表示。
(2)反码
反码是在原码的基础上发展而来的,反码表示方法如下:最高位为符号位,用0表示正数,用1表示负数,对于数值位,正数的反码数值位与原码相同,而负数的反码数值位由原码的数值位取反得到。反码的表示如图1.3所示。
图1.3 反码的表示
【例1-2】 求+78、-23的反码(设机器字长8位)。
因为
[+78]原=01001110B
[-23]原=10010111B
所以
[+78]反=01001110B
[-23]反=11101000B
反码的表示范围与原码相同,如果机器字长为n位二进制数,则反码表示的有符号数范围为-(2n-1-1)~+(2n-1-1)。例如,如果机器字长为8位二进制数,则表示的有符号数范围为-127~+127。
另外,“0”的反码表示也有两个。假设机器字长为8位,-0的反码编码为11111111B,+0的反码编码为00000000B。
反码表示时,数的运算也不方便,也存在与原码相同的问题,因而,反码在计算机中用得很少,很快就被补码表示方法所替代。
(3)补码
补码表示时,数的加减运算非常简单、方便,因而现在的计算机有符号数都用补码表示。补码表示如下:最高位为符号位,正数用0表示,负数用1表示。正数的补码与原码、反码相同,而负数的补码可在反码的基础之上,末位加1得到。对于一个负数X,其补码也可用2n-|X|得到,其中n为计算机字长。补码的表示如图1.4所示。
图1.4 补码的表示
【例1-3】 求+78、-23的补码(设机器字长8位)。
因为
[+78]反=01001110B
[-23]反=11101000B
所以
[+78]补=01001110B
[-23]补=11101000B+1=11101001B
补码表示时,这里再介绍一种比较重要的运算:求补运算。
求补运算:一个二进制数,符号位和数值位一起取反,末位加1。加1时可能向前面依次产生进位,最高位产生的进位自然丢失。
求补运算具有以下特点:对于一个任意的数X
那么,在计算机中,如果已知一个正数的补码,则可通过求补运算求得对应负数的补码;如果已知一个负数的补码,相应也可通过求补运算求得对应正数的补码。也就是说,在用补码表示时,求补运算可得到数的相反数。由于正数的补码简单,很容易计算,因而它给我们提供了另外一种计算负数补码的方法,先计算出正数的补码,再用求补运算。另外,负数的补码转换成真值不方便,我们也可以通过先计算出相应的正数来得到。
【例1-4】 用求补运算计算-25的补码(设机器字长8位)。
因为 [+23]补=00010111
所以 [-23]补=[[+23]补]求补=11101000+1=11101001B
补码表示时,如果机器字长为n位二进制数,则补码表示的有符号数范围为-(2n-1-1)~+(2n-1-1)。例如,如果机器字长为8位二进制数,则表示的有符号数范围为-128~+127。-0和+0的补码是相同的,假设机器字长为8位,则0的补码为00000000B。
(4)补码的加减运算
在现在的计算机中,有符号数的表示都用补码表示,用补码表示时运算简单。
补码的加、减法运算规则如下:
[X+Y]补=[X]补+[Y]补
[X-Y]补=[X]补+[-Y]补=[X]补+[[Y]补]求补
即:求两个数之和的补码,直接用两个数的补码相加;求两个数之差的补码,用被减数的补码加减数的相反数的补码([-Y]补),对于[-Y]补用[Y]补求补运算就可以得到,也就是说,减法运算可通过加法和求补运算来处理,下面通过例子来看看补码的加减运算。
【例1-5】 假设计算机字长为8位,完成下列补码运算。
(1)(+78)+(+23)
因为 [+78]补=01001110B,[+23]补=00010111B
所以 [(+78)+(+23)]补=[+78]补+[+23]补=01100101B=[+101]补
(2)(+78)+(-23)
因为 [+78]补=01001110B,[-23]补=11101001B
所以 [(+78)+(-23)]补=[+78]补+[-23]补=00110111B=[+55]补
(3)(+78)-(+23)
因为 [+78]补=01001110B,[+23]补=00010111B[[+23]补]求补==11101000+1=11101001B
所以 [(+78)-(+23)]补=[+78]补+[[+23]补]求补=00110111B=[+55]补
(4)(+78)-(-23)
因为 [+78]补=01001110B,[-23]补=11101001B[[-23]补]求补=00010110+1=00010111B
所以 [(+78)-(-23)]补=[+78]补+[[-23]补]求补=01100101B=[+101]补
从以上可以看出,通过补码进行加减运算非常方便,减法可转换成加法和求补运算,得到正确的结果。
3.十进制数在计算机内的表示
人们在日常生活中习惯使用十进制数,但计算机内部只能处理二进制数,为了处理方便,在计算机中,对于十进制数也提供了相应的二进制编码形式。
在计算机中,十进制数的二进制编码称为BCD码。BCD码有两种:压缩BCD码和非压缩BCD码。压缩BCD码又称8421码,用4位二进制编码来表示一位十进制符号。十进制数符号有0~9共10个,它们的压缩BCD码如表1.1所示。
表1.1 压缩BCD编码表
用压缩BCD码表示十进制数,只要把每个十进制符号用对应的4位二进制编码代替即可。例如,十进制数54的压缩BCD码为01010100。
非压缩BCD码是用8位二进制编码来表示一位十进制符号,其中低4位二进制编码与压缩BCD码相同,高4位任取。下面介绍的数字符号的ASCII码就是一种非压缩的BCD码。例如,十进制数24的非压缩BCD码为0011001000110100。
当运算的两个数是十进制BCD码表示形式时,我们希望运算的结果也是十进制BCD码表示形式。但在计算机内部并不能直接按十进制关系进行运算,只能按二进制关系进行运算,这样计算机运算时有时候结果正确,有时候结果又不正确。例如,0100(4)+0011(3)=0111(7),结果正确,而0100(4)+1000(8)=1100,结果显然不对,在压缩的BCD码中根本没有1100的编码,而正确的结果应该是00010010。怎样解决这个问题呢?在计算机中,通常通过对运算结果进行调整的方法来处理,通过对运算结果进行调整使之符合十进制数的运算和进位规律。这种调整称为十进制调整,不同的运算调整方法不同,对于两位十进制压缩BCD码加法调整过程如下:
①若加得结果的低4位为十六进制数A~F或低4位向前有进位,则低4位的内容做加0110(6)调整;
②若加得结果的高4位为十六进制数A~F或高4位向前有进位,则高4位的内容做加0110(6)调整。
【例1-6】 用压缩BCD码完成58+69的运算。
解:
58的压缩BCD码为01011000
69的压缩BCD码为01101001
运算结果做了两次调整,低4位加时向前面产生了进位,所以先对低4位做加0110(6)调整,高4位的结果为十六进制数C,所以再对高4位做加0110(6)调整。两次调整后得到正确的结果000100100111(127)。
1.1.2 字符在计算机内的表示
计算机中处理的非数值信息,最重要的就是西文字符,西文字符包括字母、数字、专用字符及一些控制字符等,它们在计算机中也通过二进制编码表示,现在计算机中西文字符的编码通常采用的是美国信息交换标准代码ASCII码(American Standard Code for Information Interchange)。标准ASCII码定义了128个字符,用7位二进制数来编码,包括26个英文大写字母A~Z,26个英文小写字母a~z、10个数字符号0~9,还有一些专用符号(如“:”、“!”、“%”)及控制符号(如换行、换页、回车等)。计算机中一般以字节为单位,而8位二进制数为1字节,西文字符ASCII码通常放在低7位,高位一般补0,在通信时,最高位常用作奇偶校验位。常用西文字符的ASCII码如表1.2所示。
表1.2 常用字符的ASCII码(用十六进制数表示)
表1.2中,数字0~9的ASCII码为30H~39H,大写字母A~Z的ASCII码为41H~5AH,小写字母a~z的ASCII码为61H~7AH。常用的控制符如回车键的ASCII码为0DH(表中用CR表示),换行键的ASCII码为0AH(表中用LF表示),空格键的ASCII码为20H(表中用SP表示)等。