1

假设我想8 bytes在堆栈上保留,并且我还想确保当前stack pointer是 8 字节对齐的。我已经看到了一些使用此逻辑确保电流sp为 8 字节对齐的代码:

sp = sp & -8;

他们AND用他们要在堆栈上保留的数量(当然是负数)。

这个逻辑是如何工作的?

4

1 回答 1

-1

它之所以有效,是因为负数用二进制补码表示,所以-8相当于~7,其中 3 个最低有效位为 0,其余为 1。将其与一个值相加会清除 3 个最低有效位,这显然会导致它是 8 字节对齐的。顺便说一句,这个技巧只适用于将事物与 2 的幂对齐。例如,如果您有一些奇怪的理由将事物与 12 字节边界对齐,则sp = sp & -12不会按预期工作。

于 2020-08-01T17:19:13.020 回答