加法器以及标志位
加法器的结构:
OF(溢出标志位),SF(符号标志位),ZF(0标志位),ZF(进位/借位标志位)
有符号数看标志位:OF,SF
无符号数看标志位:CF
有符号数,无符号数的符号看:ZF
关于OF的判断:
① 从逻辑上判断,直接将题目给的数进行相加,相减手算:如果正+正=负,负+负=正那么OF=1
② 对于双符号位,即最高位次高位=1,则OF=1
③ 看最高位与次高位的进位:Cn+Cn-1=1,则OF=1
关于SF的判断:看有符号数计算结果的最高位,最高位为1(负),SF=1,最高位为0,SF=0
关于ZF的判断:看结果是否为0
关于ZF的判断:看CinCout,也就是看SubCout
ZF仅对无符号数起作用,如果是减法,则表示借位,如果是加法,则表示进位。
这里的Sub在加法器中很关键:
加法时,Sub=0,减法时Sub=1
在加法中,结果用上图表示:X+Y+Sub=X+Y+0
在减法中,结果用上图表示:X+(-Y)+Sub=X+(-Y)+1,也就是我们常说的将[Y]补=[-Y]补,各位取反,末位加1
回来看这个式子:CinCout=SubCout
① 若是加法,则Sub=0,两个无符号数相加,结果溢出,则CF=1
② 若是减法,则Sub=1,两个无符号数相减,即X-Y=X+[-Y],若最高位的进位为0,则CF=1
注:无论是有符号数,还是无符号数,计算机是不知道的,所有的数都是通过同一个部件进行计算的,最后是正是负,结果是否溢出,都是都是人为的通过标志位的逻辑表达式或其计算的结果判断的。
接下来看看怎么通过逻辑表达式得到计算结果:
设A的符号为,B的符号为,运算结果的符号为
OF:
对于加法运算 A+B→S,若 A、B为负,且S为正,则说明发生溢出;或者,若 A、B 为正,且S为负,也说明发生溢出。
正+正=负---A0 B0 S1
负+负=正---A1 B1 S0
表达式:
对于减法运算 A-B→S,若 A为负、B为正,且F为正,则说明发生溢出;或者,若 A为正、B为负,且F为负,也说明发生溢出。
正+正=正-(-正)=正-负=负---A0 B1 S1
负-(-负)=负-正=正---A1 B0 S0
表达式:
SF:看运算结果的符号即可,SF=S