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