将二进制数向右移动时,SAR与SHR的关系

问题描述 投票:3回答:3

我们知道,当我们向右移动二进制数时,它会被2除。对于数字:1001 0001。假设它存储在AX寄存器中:

  • 如果我们将其视为无符号数字(等于十进制的145):SHR AX, 1将使AX等于0100 1000,等于十进制的72,这是正确的。

  • 但是如果我们将其视为带符号的数字(等于十进制的-111):SAR AX, 1将使AX等于等于十进制的1100 0100-56,这是错误的,因为它应等于十进制的-55

为什么?

assembly x86 x86-16 bit-shift
3个回答
3
投票

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,并向负无穷大舍入。


0
投票

我们知道,当我们向右移动二进制数时,它会被2除。

这是混乱开始的地方!shl shr sal sar只是轮班-仅此而已。如果某种变化类似于除以2,则或多或少是一种奖励。我们不能称这种行为是对还是错。

© www.soinside.com 2019 - 2024. All rights reserved.