[英]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.