若把符号数中的符号位当作一位数字,则可把整个数字按无符号数运算,结果是一样的。但要注意:因为是“模数运算”,所以进位/借位标志位没有意义;同时,符号数运算增加了“算术溢出”标志位O(或V)和负数标志位N(或S)。
例1.5 用8位运算器计算49H+D8H。
解
因为正数加负数得正数,所以没有溢出,O=0。
结果为正,N=0。
结果不为0,Z=0。
最高位有进位,C=1(只在连加/减运算中才有用)。
低位有进位,D=1。
所以,结果=21H=00100001B(+33的补码)。
标志位:NZOCD=00011。
例1.6 用8位运算器计算49H-D8H。
解
直接用减法计算:
结果为正,N=0。
正数减负数,结果为正,没有溢出,O=0。
结果不为0,Z=0。
最高位有借位,C=1。
低位无借位,D=0。
所以,结果=71H=01110001B(+133的补码)。
标志位:NZOCD=00010。
例1.7 有12位补码数X=3FCH和8位补码数Y=9AH,计算X+Y和X-Y。
解
这里要注意,进行加/减运算时,两个数的符号位要对齐。所以,对8位数要进行“符号扩展”,变为Y=F9AH。
(www.daowen.com)
结果为正,N=0。
正+负,没有溢出,O=0。
结果不为0,Z=0。
最高位有进位,C=1。
低位有进位,D=1。
所以,结果=396H(+918的补码),NZOCD=00011。
结果为正,N=0。
正+负=正,没有溢出,O=0。
结果不为0,Z=0。
最高位有进位,C=1。
低位没有进位,D=0。
若忘了对符号数进行符号扩展,结果肯定会出错。而无符号数的运算是无须符号扩展的。
例1.8 若已知A-B之后,结果的标志位NZOCD=00110,问:
①若A、B是无符号数,是A>B,还是A<B,还是A=B?
②若A、B是有符号数,是A>B,还是A<B,还是A=B?
解
这里应该搞清楚,运算器在运算时,是不区分操作数的性质的,而是直接给出运算结果和标志位,由程序员来区分(判断)结果正确与否。例如8位运算器,对无符号数的表示范围在0~255之间,结果的性质由C、Z表示,如图1.1所示。
图1.1 无符号数减法运算结果判别图
两个8位二进制无符号数的运算结果:加法在0~510之间,减法在-255~+255之间。而只有结果在0~255之间时,才是对的。无论是加法还是减法,只有C=0时,结果才正确。因此,做减法运算时,若结果为负,则被减数小于减数,即C=1。所以,由NZOCD=*0*1*可知:结果不是0,且被减数A小于减数B。
对于符号数,8位运算器能得到8位结果,即8位二进制补码所能表示的数值范围为-128~+127。若超出此范围,则O(V)=1,表示结果溢出。它用3个标志位标识:NZO。如图1.2所示。
图1.2 符号数减法运算结果判别图
所以,从NZOCD=00110可知,结果的范围如图1.2中虚线所示。因为Z=0,所以A、B不相等;由N=0、O=1,知道符号位不对,真实的N=1,所以A<B。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。