PC_二进制移位运算/定点数移位/算数移位及其移位后的空位添补规则/机器数位数扩充
文章目录
定点数位数扩充(补齐)
- 有时候,给定真值的二进制表示位数较短,为了对齐机器字长(寄存器字长),需要扩充位数
- 扩充后的机器码所对应的真值与扩充前的真值相等🎈
- 主要讨论3种机器码的扩充问题
- 原码(T(x))
- 补码(O(x))
- 反码(A(x))
正数的机器码扩充
- 正数的机器码扩充比较容易,因为T(x)=O(x)=A(x)
- 它们都是在边缘补0
- 整数在高位补0
- 小数在低位补0
负数的机器码扩充
- 不同的机器码具有
- 共同点:
- 符号位不变
- 不同点:
- 补位数码规律不同
- 共同点:
原码
- 符号位外
- 整数扩充:高位补0
- 小数扩充:低位补0
反码
- 符号位外
- 整数扩充:高位补1
- 小数扩充:低位补1
补码
- 符号位外
- 整数扩充:高位补1
- 小数扩充:低位补0
定点数的移位运算
算数移位
- 算数移位的对象是有符号数(机器数)
- 移位过程中,符号位保持不变
- 相当于对被移动的有符号机器数 x x x的真值(二进制形式)做相应的移动
算数移位的实质
-
设
真
值
x
的
机
器
码
为
X
(
x
)
设真值x的机器码为X(x)
设真值x的机器码为X(x)
- X可以取(原码/补码/反码)函数中的任意一个
-
对
X
(
x
)
进
行
算
数
移
位
,
就
是
为
了
对
真
值
x
进
行
乘
以
基
数
r
或
者
除
以
基
数
r
的
操
作
对X(x)进行算数移位,就是为了对真值x进行乘以基数r或者除以基数r的操作
对X(x)进行算数移位,就是为了对真值x进行乘以基数r或者除以基数r的操作
- 十进制数中也有类似的操作,只不过通常我们移动的是小数点,来达到类似的效果
- 二进制计算机以2为基数;十进制数以10为基数
- 移位之后,真值需要补位(而且总是补0)
- 左移引起低位缺失,补0
- 右移引起高位缺失,补0
- 而二进制机器码对真值的0/1串做了处理,因此对应到机器码里的补位需要分别讨论
逻辑移位
- 逻辑移位将操作数视为无符号数
- 移位和添补规则:
- 逻辑左移:
- 高位移丢
- 低位添0
- 逻辑右移:
- 低位移丢
- 高位添0
- 逻辑左移:
对比算数移位
- 逻辑移位将寄存器中的数最高位视为数值位,一并参与移动
- 算数右移:(以单符号位为例)
- 不移动最高位(符号位),被移动的位从第二位开始
例
- 寄存器中的内容为:x=10110010
- 对其进行逻辑右移
- 01011001
- 对其进行算数右移
- 如果将其视为补码,做右移1位操作:1,1011001
- 为了避免上述x左移最高位丢1,可使用带进位( C y C_y Cy)的左移(将符号位)移入 C y C_y Cy
- 对其进行逻辑右移
循环移位
-
分为:
- 带进位标志CF的循环移位(大循环)
- 不带进位标志的循环移位(小循环)
-
主要特点
- 移除的数位又被移入到数据中
- 是否带进位:取决于是否将进位标志CF加入循环移位
-
循环移位特别适合将数据的低字节数据和高字节数据互换
二进制移位操作
-
计算机中小数点的位置是事先约定的,
-
因此,二进制表示的机器数在相对于小数点作n 位左移或右移时,其实质就是该数乘以或除以 2 n ( n = 1 , 2 , ⋯ , n ) 2^{n}(n=1,2, \cdots, n) 2n(n=1,2,⋯,n)
-
对于带符号数 s = ± ∑ i = 0 n x i 2 i s=\pm\sum\limits_{i=0}^{n}x_i2^i s=±i=0∑nxi2i
-
左移一位(如果产生溢出)相当于乘以2
-
右移一位(如果不考虑被因移位而被舍去的末尾位),相当于除以2
-
-
🎈单符号位定点小数的移位操作
结论
- 负数的补码左移,低位补0(空位产生于低位)
- 负数的补码右移,高位补1(空位产生于高位)
声明
- 尽管您不记得该表格了,但是只要您会把不同机器码转为原码(或真值),您就可以通过原码来作为中介,通过原码的移位结果计算回转换前的机器码形式,也可以得到结果.
补位解释
- 总结出来的三种机器码的移位填补规则
- 在负数部分,三种机器码的移位添补规律虽然各有不同特点
- 但是体现在真值上的移位效果则较为一致:都是对真值进行补0
正数
-
由 于 x 的 原 码 , 补 码 , 反 码 相 同 , 即 : T ( x ) = C ( x ) = C 1 ( x ) 由于x的原码,补码,反码相同,即:T(x)=C(x)=C_1(x) 由于x的原码,补码,反码相同,即:T(x)=C(x)=C1(x)
-
所以,它们的补位操作一致
-
我们以原码的补位为代表,容易知道,补的数是0
-
负数🎁🎁
-
机 器 数 对 应 的 真 值 x 为 负 数 时 机器数对应的真值x为负数时 机器数对应的真值x为负数时
-
由于负数的原码数值部分与真值相同,故在移位时只要使符号位不变,其空位均添即可。
-
由于负数的反码各位除符号位外与负数的原码正好相反,故移位后所添的代码应与原码相反,即全部添1。
-
分析**任意负数x的补码T(x)**可发现
-
从T(x)由低位向高位找到第一个“
1
”时(为了方面描述,称这个1为 x α x_\alpha xα(即,第 α \alpha α位小数 x α = 1 x_\alpha=1 xα=1)) -
x α x_\alpha xα左边的各位均与对应的反码相同
-
x α x_\alpha xα右边的各位(包括此 α \alpha α在内)均与对应的原码相同
- 🎈这个规律(现象是在移位操作之外就存在的),下面会给出推导过程
-
故负数的补码左移时,因空位出现在低位,则添补的代码与原码相同,即添0;
-
右移时因空位出现在高位,则添补的代码应与反码相同,即添1
-
-
🎈例子
-
设机器数字长为 8 位 ( 含 1 位符号位 ) ,
-
若整数 A = ± 26 A=\pm 26 A=±26,1
-
写出三种机器数左,右移一位和两位后的表示形式及对应的真值,
-
并分析结果的正确性:
-
正数例子
-
-
可见,对于正数,三种机器数移位后符号位均不变
-
左移时最高数位丢1,结果出错;
-
右移时最低数位丢1 ,影响精度。
-
负数例子
🎈负数补码例
-
和移位前的二进制代码做对比
-
以下精度问题规律,可以从原码出发举例体验.
-
负数的原码左移时,高位丢1,结果出错;右移时,低位丢1,影响精度。
-
负数的补码左移时,高位丢0,结果出错;右移时,低位丢1,影响精度。
-
负数的反码左移时,高位丢0,结果出错;右移时,低位丢0,影响精度。
-
🎈 双符号位算数移位
结论
- 双符号位具有判断溢出的便利特点
- 当两位符号位相同(无溢出时)
- 此时两位符号位都表示真实符号位
- 移位规律按照单符号位的移位规律执行(补位)
- 当两位符号位不同(溢出)
- 此时低位符号位不是真实符号位!
- 可将其理解为数值位
- 此时对该位数进行右移,不会导致高位缺失!
- 因此不需要补位,只需要将低符号位一并右移即可
- 最后高符号位复制一份,覆盖低符号位即可
- 低位符号位需要参与移动,高位符号位不参于移动
- 此时低位符号位不是真实符号位!
- 当两位符号位相同(无溢出时)
解释
-
为了更加更好的理解,稍做推导
-
KaTeX parse error: Undefined control sequence: \set at position 176: …_1+y_1+C_{2}\in\̲s̲e̲t̲{2,3} \\C_i表示从最…
-
符号位不参与移动
- 符号位是单独处理(保持),
- 在单符号位的算数移位中也是不参于移位的)
-
下面介绍的两数相加进位规律告诉我们,双符号位最高位为什么是最终(两数相加减真实正确结果)的符号位
- 两数相减在计算机中也是转换为加法运算,因此仅讨论加法
- 该规律只是原因之一,可以结合真值表来完整证明
例(补码双符号位)
-
一般双符号位移位在补码上用的比较多,(双符号位法计算补码浮点数加/减法中的规格化中会遇到)
-
对下面的双符号位小数(补码形式)进行移位操作
- 00.11000
- 00.01100
- 11.110001
- 11.1110001
- 01.110001
- 00.1110001
- 10.110001
- 11.0110001
- 00.11000