1

使用“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。

谢谢!!

4

2 回答 2

1

它是乘以2^4, 模2^32:

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

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

dropped = (n >> (32-4)) & (1<<4-1)
于 2012-10-18T14:53:00.243 回答
1

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

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

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

于 2012-10-18T15:03:31.357 回答