Wesley Gibson 2017-10-27 09:49 采纳率: 0%
浏览 1150

关于汇编中负数算数右移需要加偏移值吗

在《深入理解计算机系统中》练习题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

  • 写回答

2条回答 默认 最新

  • Kiprey 2020-01-20 14:22
    关注

    刚好我也看到了这个练习题

    这涉及到了整数除法舍入的知识。
    正数向下舍入,负数向上舍入
    如何让负数向上舍入,这就要加一个偏移量,偏移量为 除数-1

    相关的知识在CS:APP 2.3.7 除以2的幂。

    评论

报告相同问题?

悬赏问题

  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误