在前面讨论的二进制数运算均为无符号数运算,但实际的数值是带有符号的。运算的结果可能是正数,也可能是负数。单片机在数的运算中,不可避免地会遇到正数和负数,由于计算机只能识别0和1,因此,将一个二进制数的最高位用作符号位来表示这个数值的正与负。规定符号位用“0”表示正,用“1”表示负。若用8位表示一个数,则D7位为符号位;若用16位表示一个数,则D15位为符号位。
无符号数:8位不带正、负号的数(signed),二进制00000000~11111111B,最高位不作为符号位,而当成数值位,即0~255共256个数。有符号数:数的前面增设一位符号位,并规定正号用“0”表示,负号用“1”表示(unsigned)。例如,X=-1101010B,Y=+1101010B,则带符号位时X表示为11101010B,Y表示为01101010B。例如,正数+1000101B(+45H)可以表示成01000101B;负数-101 0101B(-55H)可以表示成11010101B。“45H”和“D5H”为2个机器数,它们的真值分别为“+45H”和“-55H”。
8个二进制的位构成字节。字节可以表示28(即256)个不同的值(0~255)。位0称为最低有效位(LSB),位7称为最高有效位(MSB)。当数据值大于255时,就要采用字(2字节)或双字(4字节)进行表示。字可以表示216(即65536)个不同的值(0~65535),这时MSB为第15位。另外,有时还会用到“半字节”,即4位二进制。
1 原码
带符号二进制数(字节、字或双字),直接用最高位表示数的符号,当正数的符号位用0表示,负数的符号位用1表示,数值部分用真值的绝对值表示的形式来表示的二进制机器数称为原码,用[X]原表示,设X为整数。
若X=+Xn-2Xn-3…X1X0,则[X]原=0 Xn-2Xn-3…X1X0=X,正数的符号位0;
若X=-Xn-2Xn-3…X1X0,则[X]原=1 Xn-2Xn-3…X1X0=2n-1-X,负数的符号位1。
其中,X为n-1位二进制数,Xn-2、Xn-3、…、X1、X0为二进制数0或1。
可见,真值X与原码[X]原的关系为
值得注意的是,由于[+0]原=00000000B,而[-0]原=10000000B,所以数0的原码不唯一。二进制数的原形,可以是无符号数,也可以是有符号数。
例如,8位无符号原码数的范围是00000000~11111111B(0~FFH或0~255);8位有符号数的范围是11111111~01111111B(FFH~7FH或-127~127)。
2 反码
一个正数的反码,等于该数的原码;一个负数的反码,由它的正数的原码按位取反形成,符号位为1,反码用[X]反表示。二进制数采用原码和反码表示时,符号位不能同数值一起参加运算。
若X=-Xn-2Xn-3…X1X0,则[X]反=1Xn-2Xn-3…X1X0。
3 补码
“模”是指一个计量系统的计数量程。例如,时钟的模为12。任何有模的计量器,均可化减法为加法运算。仍以时钟为例,设当前时钟指向11点,而准确时间为7点,调整时间的方法有两种,一种是时钟倒拨4小时,即11-4=7;另一种是时钟正拨8小时,即11+8=12+7=7。由此可见,在以12为模的系统中,加8和减4的效果是一样的,即-4=+8(mod 12)。
对于n位单片机来说,数X的补码定义为
正数的补码与原码相同,负数的补码为其反码加1,但原符号位不变。
已知一个负数的补码求其真值的方法是:对该补码求补(符号位不变,数值位取反加1)即得到该负数的原码(符号位+数值位),依据该原码使可知其真值,即正数的补码就是它本身,负数的补码是真值与模数相加而得。
负数补码的求法:补码的求法一般有两种。(www.xing528.com)
1)用补码定义式:
[X]补=2n+X=2n-|X| -2n-1≤X≤0(整数)
在用补码定义式求补码的过程中,由于做一次减法很不方便,故该法一般不用。
例如,X=-0101111B,n=8,则有
[X]补=28+(-0101111B)=100000000B-0101111B=11010001B(mod 28)
2)用原码求反码,再在数值末位加1可得到补码,即[X]补=[X]反+1。
例如,假设X1=+83,X2=-76,当用8位二进制数表示一个数时,求X1、X2的原码、反码及补码。
解:[X1]原=[X1]反=[X1]补=01010011B
[X2]原=11001100B;[X2]反=10110011B;[X2]补=[X2]反+1=10110100B。
正数的原码、反码、补码就是该数本身;负数的原码其符号位为1,数值位不变;负数的反码其符号位为1,数值位逐位求反;负数的补码其符号位为1,数值位逐位求反并在末位加1。
例如,原码10000100B→补码11111100B。
可见:
1)正数的补码与其原码相同,即[X]补=[X]原。
2)零的补码为0,[+0]补=[-0]补=000…00。
3)负数才有求补码的问题。
补码的优点是可以将减法运算转换为加法运算,同时数值连同符号位可以一起参加运算。补码的用途:将减法运算转换为加法运算。
例如,123-125=01111011B+10000011B=11111110B=-2
45H-55H=-10H,用补码运算时表示为:[45H]补+[-55H]补=[-10H]补
结果11110000B为补码,求补得到原码为10010000B,真值为-0010000B(即-10H)。
表1-7所示为n个常见真值、原码、反码、补码。
表1-7 真值、原码、反码和补码
可见,采用反码时,“0”有两种表示方式,即有“+0”和“-0”之分,单字节表示范围是+127~-127;而采用补码时,“0”只有一种表示方式,单字节表示的范围是+127~-128。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。