簡體   English   中英

delphi到C ++構建器的轉換

[英]delphi to C++ builder conversion

我在Delphi中有源代碼我按照http://hscripts.com/tutorials/cpp/bitwise-operators.php為按位運算符在C ++ Builder中轉換它,但結果是不同的

Delphi中的源代碼

procedure TForm1.Button1Click(Sender: TObject)
var
    tmp, dynamicINT : integer;
begin
    dynamicINT := 42080;
    tmp := ((dynamicINT shl 1) or (dynamicINT shr 31) and $7FFFFFFF);

    Edit1.Text := IntToHex(tmp, 4);
end;

德爾福結果: 148C0正確!

C ++ Builder中的源代碼

void __fasctall TForm1::Button1Click(TObject *Sender)
{
    int tmp = 0;
    int dynamicINT = 42080;

    tmp = ((dynamicINT << 1) || (dynamicINT >> 31) && 0x7FFFFFFF);
    Edit1->Text = IntToHex(tmp, 4);
}

C ++ Builder結果: 0001 ???

轉換有什么問題?

我正在使用C ++ Builder 6和Delphi 7

|| &&是C ++中的邏輯運算符,而不是按位運算符。 它們只返回true / false。 相應的二元運算符是| &

嘗試:

tmp = ((dynamicINT << 1) | (dynamicINT >> 31) & 0x7FFFFFFF);

您正在使用邏輯運算符。 您需要使用按位運算符, &| 更不用說C ++代碼不必要地初始化然后覆蓋tmp變量。 你的代碼應該是:

int dynamicINT = 42080;
int tmp = ((dynamicINT << 1) | (dynamicINT >> 31) & 0x7FFFFFFF);

在翻譯中要注意的一點是,當應用於簽名類型時,移位運算符的含義。 我相信問題中的代碼沒有問題,因為dynamicINT有一個固定的值。 但也許在真實的代碼中它可能會有所不同。 在這種情況下,您可能會遇到實現定義或未定義的行為。

我懷疑你應該在這里使用無類型變量。 我將這些變量作為Delphi代碼中的Cardinal和C ++代碼中的unsigned int

除了Mat的答案之外 ,它可能有助於您移植以了解在C / C ++中,與Delphi / Pascal相反, 任何bool值都可以與所有整數和數字類型互換 以下廢話示例不會引起編譯器的任何警告:

bool a = 6 * 7.89;
int b = true & 128;
float f = a + !b; // which is 2

...最后但並非最不重要: 您可以在C ++ - Builder項目中使用更改的Delphi單元文件。 只是嘗試將其中一個添加到您的項目中(這樣您就可以進行遷移 - 如果仍然需要 - 一步一步)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM