繁体   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