我们知道当我们向右移动二进制数时,它除以2。
对于数字:1001 0001
。我们假设它存储在AX
寄存器中:
如果我们将其视为无符号数(小数等于145
):
SHR AX, 1
会使AX
等于0100 1000
,等于十进制的72
,这是正确的。
但如果我们将其视为带符号的数字(等于十进制的-111
):SAR AX, 1
会使AX
等于1100 0100
,它等于到十进制的-56
,这是错误的,因为它应该等于十进制的-55
。
为什么?
答案 0 :(得分:2)
SHR
指令执行无符号的转移权限:
Input: 1001 0001
| |\
+------+ +--> lost
v
+------+
| |
Output: 0100 1000
^
+-- added by SHR
另一方面,SAR
指令执行签名右移,将最高位解释为符号:
Input: 1001 0001
| |\
+------+ +--> lost
| v
|+------+
v| |
Output: 1100 1000
^
+-- preserved (copied) by SAR
答案 1 :(得分:1)
算术右移除2,向负无穷大舍入。
答案 2 :(得分:0)
我们知道当我们向右移动二进制数时,它除以2
这就是混乱开始的地方!
shl shr sal sar
只是转变 - 仅此而已。如果某种类型的转变类似于2除以它或多或少的奖励。我们不能称这种行为是对还是错。