我将一些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计算器相同的结果。
答案 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;
希望它有所帮助!