Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stack 使用位运算符确保堆栈指针对齐_Stack_Alignment_Memory Alignment_Sp_Stack Pointer - Fatal编程技术网

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
将无法正常工作