Stack 使用位运算符确保堆栈指针对齐
假设我想在堆栈上保留Stack 使用位运算符确保堆栈指针对齐,stack,alignment,memory-alignment,sp,stack-pointer,Stack,Alignment,Memory Alignment,Sp,Stack Pointer,假设我想在堆栈上保留8字节,并且我还想确保当前堆栈指针是8字节对齐的。我见过一些代码,它们确保当前sp使用以下逻辑进行8字节对齐: sp = sp & -8; 他们将和与他们将在堆栈上保留的金额(当然是负数)进行比较 这个逻辑是如何工作的?它之所以工作,是因为负数用2的补码表示,所以-8相当于~7,其中3个最低有效位为0,其余为1。将其与一个值相加将清除3个最低有效位,这显然会导致它是8字节对齐的。顺便说一下,这个技巧只适用于将事物与2的幂对齐。例如,如果您有一些奇怪的原因将事物与12
8字节
,并且我还想确保当前堆栈指针
是8字节对齐的。我见过一些代码,它们确保当前sp
使用以下逻辑进行8字节对齐:
sp = sp & -8;
他们将和
与他们将在堆栈上保留的金额(当然是负数)进行比较
这个逻辑是如何工作的?它之所以工作,是因为负数用2的补码表示,所以
-8
相当于~7
,其中3个最低有效位为0,其余为1。将其与一个值相加将清除3个最低有效位,这显然会导致它是8字节对齐的。顺便说一下,这个技巧只适用于将事物与2的幂对齐。例如,如果您有一些奇怪的原因将事物与12字节边界对齐,sp=sp&-12
将无法正常工作