(计算机组成原理)第二章数据的表示和运算-第二节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:定点数乘法运算(原码/补码一位乘法)