【发布时间】: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