单片机原理、接口及应用系统设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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表示)等。