汇编中无符号32位整数的左移

时间:2012-10-18 14:46:43

标签: c assembly bit unsigned shift

使用“sall”指令对装配中左移的快速提问。

根据我的理解,“sall rightop,leftop”会转换为“leftop = leftop<< rightop”,所以取一个整数并向左移位4个空格将导致乘以2 ^ 4

但是当整数是无符号的,32位时会发生什么,并且类似于:

1111 1111 1111 1111 1111 0000 0010 0010

这种情况下的左移会变成1111 1111 1111 1111 0000 0010 0010 0000吗?

显然这不是乘以2 ^ 4。

谢谢!

2 个答案:

答案 0 :(得分:1)

它是2^4的乘法,模2^32

n = (n * 2^4) % (2 ^ 32)

你可以通过执行左移然后屏蔽来检测“移出”的位,在这种情况下

dropped = (n >> (32-4)) & (1<<4-1)

答案 1 :(得分:1)

左移(SALSHL)只是丢失了左边的位。右边的位用0填充。如果任何丢失的位为1,则在乘法方面会出现溢出和错误的结果。您可以将S*L用于非负值和负值。

常规右移(SHR)以完全相同的方式工作,但方向相反,左边的位用0填充,你丢失了右边的位。结果有效地舍入/截断为0.您使用非负值SHR,因为它不保留值的符号(0写入其中)。

算术右移(SAR)略有不同。最高有效位(=最左边的位,符号位)不会被填充0.它将填充其先前的值,从而保留值的符号。另一个值得注意的区别是,如果值为负,则右侧的丢失位导致向负无穷大而不是0的舍入。