3

一部の C# コードを Delphi (XE5) に移植しています。C# コードには次のようなコードがあります。

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

私はこれを翻訳しました

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

今、Delphi が (時々) 負の t をシフトするために間違った値を計算することがわかります。

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

Delphi: 
-170358640930559629 shr 25               = 544678730749 (wrong)

この例では、-1*((-t shr 25)+1) は Delphi で正しい値を返します。

ta の他の負の値については、整数への単純な型キャストが正しい結果を与えるようです:

integer(t shr 25)

私は二項演算と表現に関して限界に達しているので、C# や Windows 電卓のように Delphi で同じ結果を得る方法を教えていただければ幸いです。

4

2 に答える 2

4

Filipeの回答にリンクされている記事に基づいて(これは、Delphiが他の人がaを実行するのではなくaを実行する理由を述べています)、これに対する私の見解は次のとおりです。shrsar

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;
于 2014-02-21T20:16:32.313 に答える