假设我想在堆栈上保留
8 bytes
并且我还想确保当前 stack pointer
是 8 字节对齐的。我见过一些代码,使用此逻辑确保当前 sp
是 8 字节对齐的:
sp = sp & -8;
他们
AND
他们将在堆栈上保留的金额(这当然是负数)。
这个逻辑是如何运作的?
它之所以有效,是因为负数以二进制补码表示,因此
-8
相当于 ~7
,其中 3 个最低有效位为 0,其余为 1。将其与一个值进行“与”操作会清除 3 个最低有效位,这显然会导致它是 8 字节对齐的。顺便说一句,这个技巧仅适用于将事物对齐到 2 的幂。例如,如果您有一些奇怪的原因将事物对齐到 12 字节边界,则sp = sp & -12
将无法按预期工作。