【问题标题】:Arithmetic Shift Right rather than Logical Shift Right算术右移而不是逻辑右移
【发布时间】:2015-02-05 21:18:52
【问题描述】:

我正在尝试在 Delphi 中执行算术移位。但我无法让它工作,它总是给出错误的答案。

这是我的代码;

  lValue := offset;
  asm
    mov cl,32
    sar lValue,cl
  end;
  hgh := lValue and $FFFFFFFF;

当offset 设置为1024 并且右移设置为32 时,hgh 应该等于0。在我的代码中,hgh = 1024。

【问题讨论】:

  • 如果我没记错的话,该指令仅支持最多 31 位(5 位位移值)的移位。
  • @500-InternalServerError - 我怎样才能让它做得更多?
  • @500-InternalServerError 的评论绝对正确:“...所有其他 IA-32 处理器(从 Intel 286 处理器开始)确实将移位计数屏蔽为 5 位,从而导致最大计数为31”。混合 Pascal 和 BASM 并没有什么问题,但是你必须非常小心汇编程序(就像往常一样)。
  • 当你说 C++“正常工作”是什么意思?使用 >> 运算符将 32 位整数右移超过 31 位是未定义的。使用内联汇编器右移将得到与您的 Delphi 代码相同的结果,因为无论哪种情况,汇编器都是相同的。
  • 您的标题似乎表明您认为逻辑移位和算术移位之间存在差异,但在这种情况下,没有。对于非负输入,它们的行为相同。

标签: delphi


【解决方案1】:

对于大于或等于 32 的数字,您应该有条件地移动 31 位

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多