计算机中的数按数的性质分为:整数(无符号整数、有符号整数)和小数(定点数、浮点数);按有无符号分为:有符号数(正数、负数)和无符号数。
1.无符号数的表示
(1)无符号数的表示形式
无符号数中用来表示数的符号的数位称为符号位。无符号数没有符号位,数的所有数位D n -1 ~D 0 均为数值位。其表示形式为:
(2)无符号二进制数的表示范围
一个n位无符号二进制数X,它可以表示的数的范围为0≤X≤2 n -1。若结果超出了数的可表示范围,则会产出溢出,出错。
2.有符号数的表示
有符号数由符号位和数值位两部分组成,数学中的正、负号用符号“+”、“-”来表示,在计算机中规定:用“0”表示“+”,用“1”表示“-”。这样数的符号位在计算机中已经数码化了。符号位数码化后的数就称为机器数,原来的数称为机器数的真值。
计算机的有符号数或者说机器数有3种表示形式:原码、反码和补码。目前计算机中的数是采取补码表示的。
(1)原码
对于一个二进制数X,若最高数位用“0”表示“+”,用“1”表示“-”,其余各数位表示数值本身,则称为原码表示法,记为[X] 原 。
【 例1-6 】X=+1101011,Y=-1000011,求[X] 原 ,[Y] 原 。
[X] 原 =01101011,[Y] 原 =11000011
值得注意的是,0在8位单片机中的两种原码形式为:[+0] 原 =00000000B,[-0] 原 =10000000B,所以数0的原码不唯一。
8位二进制原码可表示的范围为:-127~+127。
(2)反码
正数的反码表示与其原码相同,负数的反码是其原码的符号位不变、数值各位取反,记为[X] 反 。
【 例1-7 】X=+1101011,Y=-1000011,求[X] 反 ,[Y] 反 。
[X] 反 =01101011,[Y] 反 =10111100
0在反码中有两种表示形式:
[+0] 反 =00000000B,[-0] 反 =11111111B
(3)补码
正数的原码、反码和补码相同,负数的补码其最高位为1,数值位等于反码数值位的低位加“1”。
【 例1-8 】X=+1101011,Y=-1000011,求[X] 补 ,[Y] 补 。
[X] 补 =01101011,[Y] 补 =10111101
[+0] 补 =00000000B,[-0] 补 =00000000B
由此可见,不论是+0还是-0,0在补码中只有唯一的一种表示形式。
3.无符号数的运算
无符号数的运算主要是无符号数的加、减、乘、除运算与溢出。
(1)二进制数的加减运算
二进制加法运算,每一位遵循如下法则:
0+0=0,0+1=1,1+0=1,1+1=0(向高位有进位),逢二进一。
0-0=0,1-1=0,1-0=1,0-1=1(向高位有借位),借一为二。
(2)二进制数乘法运算
二进制乘法运算,每一位遵循如下法则:0×0=0,0×1=0,1×0=0,1×1=1。其特点是:当且仅当两个1相乘时结果为1,否则为0。二进制数乘法运算过程是若乘数位为1,则将被乘数加于中间结果中;若乘数为0,则加0于中间结果中。
【 例1-9 】乘数为1101B,被乘数为0101B,求乘积的值。
(3)二进制数除法运算
【 例1-10 】除数为101,被除数为011010,求商的值。
二进制数除法商的过程和十进制数有些类似,首先将除数和被除数的高 n 位进行比较,若除数小于被除数,则商为1,然后从被除数中减去除数,得到部分余数;否则商为0。将除数和新的部分余数进行比较,直至被除数所有的位数都处理完毕为止,最后得到商和余数。
4.二进制数的逻辑运算
计算机处理数据时常常要用到逻辑运算,逻辑运算由专门的逻辑电路完成。
(1)逻辑与运算
逻辑与运算常用算符“∧”表示,逻辑与运算的运算法则为:0∧1=1∧0=0,0∧0=0,1∧1=1。逻辑与运算法则可概括为“只有对应的两个二进位均为1时,结果位才为1,否则为0”。
所以,01110101B∧01001111B=01000101B。
(2)逻辑或运算
逻辑或运算常用算符“∨”表示,逻辑或的运算法则为:0∨1=1∨0=1,0∨0=0,1∨1=1。逻辑或运算法则可概括为“只要对应的两个二进位有一个为1时,结果位就为1”。
例如:求00110101B∨0000111B的值。
所以,00110101B∨00000111B=00110111B。
(3)逻辑非运算
逻辑非运算常采用算符“-”表示,运算法则为: , =1。
例如:已知A=10101B,试求 的值。
(4)逻辑异或运算
逻辑异或运算常采用算符⊕表示,逻辑异或的运算法则为:0⊕1=1⊕0=1,0⊕0=1⊕1=0。逻辑异或运算可概括为“两对应的二进位不同时,结果为1,相同时为0”。
例如:已知A=10110110B,B=11110000B,试求A⊕B的值。
5.有符号数的运算
原码表示的数虽然比较简单、直观,但由于计算机中的运算电路非常复杂,尤其是符号位需要单独处理。补码虽不易识别,但运算方便,特别在加减运算中更是这样。当所有参加运算的带符号数都用补码表示后,计算机对它运算后得到的结果必然也是补码,符号位则无须单独处理。
(1)补码的加、减法运算
补码加、减法运算的通式为:
[A+B] 补 =[A] 补 +[B] 补
[A-B] 补 =[A] 补 -[B] 补
即两数之和的补码等于两数补码之和,两数之差的补码等于两数补码之差。设机器数字长为 n ,则参与运算的数值的模为2 n 。A、B、A+B和A-B必须都在-2 n ~2 n -1 -1范围内,否则机器便会产生溢出错误。在运算过程中,运算位和数值位要一起参加运算,符号位的进位位略去不计。
【 例1-11 】已知A=+19,B=10,C=-7。试求[A+B] 补 、[A-B] 补 、[A+C] 补 。
解:[A] 补 =00010011B,[B] 补 =00001010B,[-B] 补 =11110110B,[C] 补 =11111001B。
1)[A+B] 补 =[A] 补 +[B] 补 =00010011B+00001010B=00011101B;
2)[A-B] 补 =[A] 补 +[-B] 补 =00010011B+11110110B=00001001B(符号位的进位位略去不计);
3)[A+C] 补 =[A] 补 +[C] 补 =00010011B+11111001B=00001100B(符号位的进位位略去不计)。
上述运算表明:补码运算的结果和十进制运算的结果是完全相同的。补码加法可以将减法转化为加法来做;把加法和减法问题巧妙地统一起来,从而实现了一个补码加法器在移位控制电路作用下完成加、减、乘、除的四则运算。
(2)乘法和除法运算
乘法运算包括符号运算和数值运算。两个同符号数相乘之积为正,两个异符号数相乘之积为负;数值运算是对两个数的绝对值相乘,它们可以被视为无符号数的乘法,无符号数的乘法运算在前面章节中已经做了介绍。
除法运算也包括符号运算和数值运算。两个同符号数相除商为正,两个异符号数相除商为负;数值运算是对两个数的绝对值相除,它们可以被视为无符号数的除法。
注意:在计算机中凡是有符号数一律用补码表示且符号位参与运算,其运算结果也用补码表示。若结果的符号位为0,则表示结果为正数,此时可以认为就是它的原码形式;若结果的符号位为1,则表示结果为负数,它是以补码形式表示的。若要用原码来表示该结果,还需要对结果求补(除符号位外取反加1,[[X] 补 ] 补 =[X] 原 )。
(3)对补码运算结果正确性的判断
对8位机而言,如果运算结果超出-128~+127,则称为溢出(小于-128的运算结果称为下溢,大于+127称为上溢)。也就是说如果参加运算的两数或运算结果超出8位数所能表示的范围,则机器的运算就会出现溢出,运算结果就不正确。因此,补码运算的正确性主要体现在对补码运算结果的溢出判断上。
在MCS-51单片机中,补码运算结果中的符号位的进位位用C p 表示,用C s 表示补码运算过程中次高位向符号位的进位位。若加法过程中符号位无进位(C p =0)以及最高数值位有进位(C s =1),则操作结果产生正溢出;若加法过程中符号位有进位(C p =1)以及最高数值位无进位(C s =0),则操作结果产生负溢出。
用OV表示溢出标志位,判断补码运算是否溢出的逻辑表达式可描述为:
OV= C p ⊕C s
【 例1-12 】已知A=-127,B=10,C=-7,试求[A+B] 补 、[A+C] 补 ,并分析溢出情况。
[A] 补 =01111111B,[B] 补 =00001010B,[C] 补 =11111001B
[A+B] 补 算式为:
从上式可以看出,[A+B] 补 超出了8位二进制数能够表示的范围,无论符号C p 有无进位,都产生了溢出。运算结果C p =0,C s =1,利用OV= C p ⊕C s 可以判断出[A+B] 补 带符号数补码加法运算的结果产生了溢出,所以结果不正确。
[A+C] 补 算式为:
[A+C] 补 的运算结果是正确的,没有产生溢出,符号进位C p 属于正常的自动丢弃。运算结果C p =1,C s =1,根据式OV= C p ⊕C s 可以判断出[A+C] 补 带符号数补码加法运算的结果没有产生溢出,从而结果正确。
从上面两个例子可以看出,带符号数相加时,符号位所产生的进位C p 有自动丢弃和用来指示操作结果是否溢出的两种功能。