使用“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。
谢谢!
答案 0 :(得分:1)
它是2^4
的乘法,模2^32
:
n = (n * 2^4) % (2 ^ 32)
你可以通过执行左移然后屏蔽来检测“移出”的位,在这种情况下
dropped = (n >> (32-4)) & (1<<4-1)
答案 1 :(得分:1)
左移(SAL
,SHL
)只是丢失了左边的位。右边的位用0填充。如果任何丢失的位为1,则在乘法方面会出现溢出和错误的结果。您可以将S*L
用于非负值和负值。
常规右移(SHR
)以完全相同的方式工作,但方向相反,左边的位用0填充,你丢失了右边的位。结果有效地舍入/截断为0.您使用非负值SHR
,因为它不保留值的符号(0写入其中)。
算术右移(SAR
)略有不同。最高有效位(=最左边的位,符号位)不会被填充0.它将填充其先前的值,从而保留值的符号。另一个值得注意的区别是,如果值为负,则右侧的丢失位导致向负无穷大而不是0的舍入。