Delphi转换为C++ Builder

4

我有一份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;

Delphi的结果是: 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++ Builder已经“内置了Delphi”... - Wolf
3个回答

8

||&& 是 C++ 中的逻辑运算符,而非位运算符。它们只返回 true/false。对应的二进制运算符是 |&

尝试:

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

哦,我的天啊...非常感谢Mat。我很感激。 - AkisC

2

您正在使用逻辑运算符。您需要使用位运算符&|。此外,C++代码不必要地初始化了tmp变量,然后又对其进行了覆盖。您的代码应该是:

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

在翻译中需要注意的一点是,当应用于有符号类型时,移位运算符的含义。我认为在问题代码中没有问题,因为dynamicINT具有固定值。但是在实际代码中可能会有变化。在这种情况下,您可能会遇到实现定义或未定义的行为。
我怀疑您应该在此处使用未类型化的变量。在Delphi代码中,我将这些变量设为Cardinal,在C++代码中将其设为unsigned int。

1
除了 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单元文件。尝试向您的项目添加其中一个(这样您可以逐步进行迁移 - 如果仍然需要的话)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接