使用按位运算符确保堆栈指针对齐

问题描述 投票:0回答:1

假设我想在堆栈上保留

8 bytes
并且我还想确保当前
stack pointer
是 8 字节对齐的。我见过一些代码,使用此逻辑确保当前
sp
是 8 字节对齐的:

sp = sp & -8;

他们

AND
他们将在堆栈上保留的金额(这当然是负数)。

这个逻辑是如何运作的?

stack alignment memory-alignment stack-pointer
1个回答
0
投票

它之所以有效,是因为负数以二进制补码表示,因此

-8
相当于
~7
,其中 3 个最低有效位为 0,其余为 1。将其与一个值进行“与”操作会清除 3 个最低有效位,这显然会导致它是 8 字节对齐的。顺便说一句,这个技巧仅适用于将事物对齐到 2 的幂。例如,如果您有一些奇怪的原因将事物对齐到 12 字节边界,则
sp = sp & -12
将无法按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.