左右位如何移位31等于& 0x7FFF的

时间:2014-03-18 19:54:43

标签: c assembly

我正在将x86 Assembly转换为C代码,并且无法弄清楚为什么这两行在下面等于C代码。

汇编代码:

sall $31, %eax
sarl $31, %eax

等效C代码:

int t = t & 0x7FFF;

其次,C代码的等效表达式是:

t = t << 31;
t = t >> 31;

1 个答案:

答案 0 :(得分:0)

sall / sarl组合不等同于AND 0x7FFF。由于它是算术移位(与逻辑相反),当向右移位时,它会使用符号位的副本填充这些位。因此,如果eax在最左边的位中为零,则它变为零,如果它有一个,则变为0xffffffff。

SALL线将寄存器几乎一直移到左边。最右边(第0)位成为最左边(第31位,AKA是符号位)。然后向右移动将最左边的位移回最右边的位置,用其副本填充移入的位。

<< / >>右侧组合 等效,只要将t声明为有符号数据类型(默认情况下int已签名)。移位无符号数据类型不会签名扩展;在汇编级别,这是SHRL命令。