在《深入理解计算机系统中》练习题3.20中有一个问题实在想不通。
负数的算数右移k位在汇编代码中为什么要加上一个2的k次方-1的偏移量?
直接算数右移不就可以得到正确结果吗?
是必须这样吗?
请大神指点一下!谢谢!
#include<stdio.h>
long arith(long x);
int main(void)
{
long a=-16;
long b;
b=arith(a);
return 0;
}
long arith(long x)
{
return x/8;
}
这是gcc编译的汇编。
main:
.LFB23:
.cfi_startproc
movl $0, %eax
ret
.cfi_endproc
.LFE23:
.size main, .-main
.globl arith
.type arith, @function
arith:
.LFB24:
.cfi_startproc
leaq 7(%rdi), %rax
testq %rdi, %rdi
cmovns %rdi, %rax
sarq $3, %rax
ret
.cfi_endproc
刚好我也看到了这个练习题
这涉及到了整数除法舍入的知识。
正数向下舍入,负数向上舍入
如何让负数向上舍入,这就要加一个偏移量,偏移量为 除数-1
相关的知识在CS:APP 2.3.7 除以2的幂。
学习了