最近在复习计算机组成原理定点数的四则运算这一部分,书上关于四则运算的移位方式讲得相当含糊其辞,在网上搜了很多文章也讲不明白,甚至还误人子弟,因此便决定自己写篇文章来好好捋一捋,也方便以后复习查找。
一、算术移位和逻辑移位有什么区别?
- 无符号数的移位是逻辑移位,有符号数的移位是算术移位。这句话是很广泛的一句说法,但我觉得,无符号数的移位确实一定是逻辑移位,但有符号数的移位不一定是算术移位,即有符号数在某些运算下也可能是逻辑移位。
- 再从二者如何移位上说一下区别。前面我说有符号数既可以算术移位也可以逻辑移位,那么这两个移位有什么操作上的区别呢?逻辑移位时,符号位是参与移位的;而算术移位时,符号位是不参与移位的。而且不论左移还是右移,逻辑移位总是在空出的位置上补0;而算术移位则需要细分:对于真值为正,不论左移还是右移,不论原反补码,都是补0;对于真值为负,原码和真值为正的情况一样,补码左移时低位补0,补码右移时高位补1,反码不论左移还是右移都是补1。
二、不同码制的乘除各是什么移位?
- 原码一位乘法:逻辑右移。这个很好理解,还记得原码一位乘时符号位是单独计算的,也就是说我们计算数值位的时候就相当于在计算无符号数,自然也就是逻辑移位。
- 原码两位乘法:逻辑右移。与原码一位乘相同。
- 补码一位乘法:算术右移。补码一位乘时符号位和数值位是一起参与运算的,因此算术右移也不奇怪。
- 原码加减交替除法:逻辑左移。其实和原码乘法差不多。
- 补码加减交替除法:逻辑左移。这里可能有些奇怪,补码除法时符号位没有单独运算,为什么还是逻辑移位。我也解释不了,但是我试过用算术移位,但是算出的结果是错的,大家有好的解释的话可能给我留言。