(计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位逻辑移位和循环移位)

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位逻辑移位和循环移位)相关的知识,希望对你有一定的参考价值。

定点数的移位运算根据操作对象的不同划分为算数移位和逻辑移位。有符号数的移位称为算数移位,逻辑移位操作对象时逻辑代码,可视为无符号数

其实我们很小的时候就学会了移位运算。
比如 985.211 × 1 0 1 = 9852.11 985.211 × 10^{1} =9852.11 985.211×101=9852.11就相当于小数点后移 1 1 1
比如 985.211 ÷ 1 0 1 = 98.5211 985.211 \\div 10^{1}=98.5211 985.211÷101=98.5211就相当于小数点前移 1 1 1

所以移位的本质:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权

一:算数运算

算数移位的对象时有符号数,在移位的过程中符号位保持不变

(1)原码的算数移位

1:算数右移

如下是-20的原码

符号位不动,向右移动1位,高位补0,再向右移动1位,高位补0

  • 大家可以发现如果移除去的是0,那么算数右移相当于除以了2

此时最低位为1,再次右移一位,其结果为-2,但是按照先前的逻辑除以2应该是2.5。所以右移时如果移出去的是非0,那么会丢失精度


2:算数左移

依然以上面的例子为例,左移时符号位不动,低位补0,如果移出去的是0,那么乘以2后结果没有问题

但是如果左移时移出去的是1,那么就会出现严重误差。比如上图中再次左移时,要将高位的1抛弃,而7位二进制表示范围为-128~128,理想的结果-160自然超出范围

(2)反码的算术移位

(正数的反码算数移位和原码相同)

对于负数,其反码除了符号位外其余各位和原码是一一取反的,因此反码的1对应原码的0,反码的0对应原码的1

所以反码算数右移时高位补1,低位舍弃;算数左移时低位补1,高位舍弃

(3)补码的算数移位

(正数的补码算数移位和原码相同)

对于负数,其补码是在反码末位+1得到的,所以这就导致反码最右边连续的1都会因为进行而变为0,直到进位碰到第一个0为止。因此,负数补码中,最右边的(最后一个1)及其右面与原码相同,而其左面则与反码相同


因此,补码算数右移时和反码相同,也即高位补1,低位舍弃;而算数左移时又会和原码相同,也就是低位补0,高位舍弃


总结如下

因此在这种情况下, − 20 × 7 -20 × 7 20×7相当于 − 20 × ( 2 0 + 2 1 + 2 2 ) -20×(2^{0}+2^{1}+2^{2}) 20×(20+21+22),因此就是左移1位再左移2位

二:逻辑移位

逻辑移位比较简单,可以看作是对“无符号数”的算数移位
逻辑右移时高位补0,低位舍弃;逻辑左移时低位补0,高位舍弃

三:循环移位

循环移位分为带进位标志位CF的循环移位(大循环)和不带进行标志位的循环移位(小循环),过程如下所示

循环移位的主要特点是:移除的数位又被移入数据中,而是否进行则需要看是否将进位标志加入循环位移。
循环位移操作十分适合将数据的低字节和高字节之间的互换

以上是关于(计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位逻辑移位和循环移位)的主要内容,如果未能解决你的问题,请参考以下文章

(计算机组成原理)第二章数据的表示和运算-第二节1:定点数的表示(原码反码补码和移码)

(计算机组成原理)第二章数据的表示和运算-第二节7:详解C语言中的强制类型转换

(计算机组成原理)第二章数据的表示和运算-第二节8:数据的存储和排列

(计算机组成原理)第二章数据的表示和运算-第二节5:定点数乘法运算(原码/补码一位乘法)

(计算机组成原理)第二章数据的表示和运算-第二节6:定点数除法运算(原码/补码一位除法)

(计算机组成原理)第二章数据的表示和运算-第二节2:原码反码补码和移码的作用