`
bcyy
  • 浏览: 1824530 次
文章分类
社区版块
存档分类
最新评论

补码与算术右移指令

 
阅读更多

补码与算术右移指令

补码杂谈

补码的优越性,使得用最高位作符号的原码显得多余。正数的补码是它本身,负数的补码通过对其绝对值进行求补获得。求补运算是将数值按位取反,再加一。不要与补码的概念混淆。它具有许多的优良的特性。

求补过程与反求补过程为同一过程,也就是说,对一个数求补两次后,还是这个数本身。通过补码的物理意义这是很好理解的。也可以分析求补的运算过程来说明。对某数按位取反后,加上1,这时开始从最低位向高位进位,直到某个高位上为零,无法向更高位进位为止(当然有个极端的情况的就是对0求补,而0的求补结果为其本身,大可抛开它不谈)。产生的效果是最低的若干位被取反,且这若干位的形式应该为1加上若干个0(当然可以是0个)。这些被加1影响的若干位就相当于被取反了两次,也就是说得到的是它们原来的样子。而未被加1影响的部分则被取反了一次。再进行一次求补运算,看看会出现什么结果。先取反,这样未被加1影响的部分就进行了两次取反而恢复了原貌。而被加1影响部分取反后得到的形式为一个0带上若干个1(可以为0个1),这样的形式在加上1后会被全部取反,而不影响别的部分。这样这部分又恢复了原貌。所以整个数又恢复了原貌。

用补码进行加法运算的时候,易于判断结算是不是溢出。判断的方法是计算次高位与最高位向其高位的进位的异或,结果若为0则表示正常,否则表示溢出。溢出的情形无非两种,分别为两正数与两负数相加的时候。两正数相加是次高位进位时,显然是溢出的情形,而这时最高位为0,无法再进位,这样进位异或结果为1,反映溢出;两负数相加时,最高位肯定有进位。这样,只有次高位无法进位时,才使异或结果为1。而这时,表示的就是溢出。可以把负数的绝对值看成油罐中的油,其补码除最高位后的部分可以看成油罐中的剩余空间。当两罐油倒成一桶进,如果剩下的空间没有够一罐,那么油一定溢出了。

算术右移指令

算术右移指令SAR(shift arithmetic right)的操作是,将寄存器中的数值右移,最左端用最高位填充,而不是补零。这里分析它为什么不直接补零的原因。为方便讨论,考虑右移一位的情况。右移若干位的情况,也可做相似的分析。

不直接补零的根本原因是为了不改变数值的符号并且使得数值是原来的一半。众所周知,符号数是以补码的形式存储在计算机内的。正数的补码是其本身,最高位为0。 右移1位时,最高位补零,其值缩小一半。这没有什么问题。对于负数,其补码为对其绝对值求补后获得。最高位补1,也相当于次高位补1,能达到缩小一半的效果吗?那要看右移后对应的原码是否为原来的一半了。也就是,在最高位与次高位是不是0。要查看原码,只需对结果求一次补就行了。求补第一步是取反,这样填充的1就成了0,没有出现问题,但还得看第二步加1。哪些情况下加上1可能会影响次高位呢?答案只有两个数。当原来的补码除最高位与最低位都是0的时候,右移一位后除最高位外都是0,在求补进取反后这些0变成了1,加1后,进位会影响到次高位,使之变成1(经取反后,次高位被置成了0),而原码的次高位应该填充0的,这样就没有达到缩小原数的效果。以4位数为例,这样的数为:1000,1001。1000如果要计算机看成符号数的话,会被看成-16!而其它数,因为中间部分有1,取反后变成了0,加1后的进位不能影响到次高位,所有可以达到缩小原数且不改变符号的效果。

计算机求补的情形不多,一是指令中的数含有负号的时候,但如果指令中出现负0,也就是‘-0’汇编器会把它变成0。二是作减法运算的时候。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics