2014-02-21 34 views
2

我將一些C#代碼移植到Delphi(XE5)。 C#代碼有這樣的代碼:int64上的SHR不返回預期的結果

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中給出了正確的值。

對於TA簡單的類型強制轉換爲整數似乎給正確的結果的其它負值:

integer(t shr 25) 

我在我的關於二進制運算和表示的限制,所以我很感激只是得到相同的任何幫助Delphi中的結果就像在C#和Windows計算器中一樣。

+0

問題是在解釋這個評論:http://stackoverflow.com/questions/5348540/what-is-a-equivalent-of-delphi-shl-in-c#comment6042256_5348558 –

+0

你的'-1 *(( - 值shr位)+1) '當'Value = -4'和'Bits = 1'時失敗。它返回'-3'而不是'-2'。 – JRL

回答

4

基於對鏈接的article菲利佩的answer(其中規定的原因而德爾福開展一個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; 
+0

+1。這很好。當'值'爲負值時,它用正確的'1'位替換'shr'放置的最左'0'位。 '和'條件等同於'值<0'。 – JRL

+0

@JRL - 謝謝!你認爲讓這個'消極'測試更具可讀性在這裏會很好嗎?畢竟它涉及一些轉變.. –

+0

我認爲這是好的,就像它是。 – JRL

0

正如你可以閱讀here,C和Delphi對待Shr的方式是不同的。這並不意味着指責,但C's >>並不是真正的指責,它實際上是一種思想。 無論如何,我發現的唯一解決方法是手動進行數學計算。這裏有一個例子:

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

希望它有幫助!

+0

您的SAR功能似乎是由一個: SAR(-1841198311509,25)返回-54871,而Windows Calc返回-54872。 – user3338237

+0

剛剛改變了功能,看看你的想法。這是在答案編輯。 –

+1

@GJ。 - 查看修訂歷史記錄,並查看答案的第一條評論。 –