int64上的SHR不返回预期结果

时间:2014-02-21 17:21:06

标签: delphi delphi-xe5 int64

我将一些C#代码移植到Delphi(XE5)。 C#代码的代码如下:

long t = ...
...                
t = (t >> 25) + ...

我将其翻译为

t: int64;
...
t := (t shr 25) + ...

现在我看到德尔福(有时)计算出错误的值来转移负面的t,例如:

-170358640930559629 shr 25
Windows Calculator: -5077083139
C# code: -5077083139

Delphi: 
-170358640930559629 shr 25               = 544678730749 (wrong)

对于这个例子,-1 *(( - t shr 25)+1)在Delphi中给出了正确的值。

对于t的其他负值,简单的类型转换为整数似乎给出了正确的结果:

integer(t shr 25)

我对二进制操作和表示有限制,所以我很感激任何帮助,只需在Delphi中获得与C#和Windows计算器相同的结果。

2 个答案:

答案 0 :(得分:4)

基于Filipe的article中链接的answer(其中说明了原因是Delphi执行shr而不是其他人执行sar),这是我的接受这个:

function CalculatorRsh(Value: Int64; ShiftBits: Integer): Int64;
begin
  Result := Value shr ShiftBits;
  if (Value and $8000000000000000) > 0 then
    Result := Result or ($FFFFFFFFFFFFFFFF shl (64 - ShiftBits));
end;

答案 1 :(得分:0)

正如你可以阅读here,C和德尔福对待Shr的方式是不同的。不是指点手指,而是C>>实际上并不是一个小小的,它实际上是一个战争。 无论如何,我发现的唯一解决方法是手动进行数学运算。这是一个例子:

function SAR(a, b : int64): int64;
begin
  result := round(a / (1 shl b));
end;

希望它有所帮助!