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;

德尔福结果:148C0正确!

C++ 生成器中的源代码

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

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

C++ 生成器结果:0001???

转换有什么问题?

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

4

3 回答 3

8

||并且&&是 C++ 中的逻辑运算符,而不是位运算符。他们只返回真/假。对应的二元运算符是|and &

尝试:

tmp = ((dynamicINT << 1) | (dynamicINT >> 31) & 0x7FFFFFFF);
于 2014-05-20T07:22:07.350 回答
2

您正在使用逻辑运算符。您需要使用按位运算符,&并且|. 更重要的是 C++ 代码不必要地初始化然后覆盖tmp变量。您的代码应该是:

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

翻译中要注意的一件事是移位运算符在应用于有符号类型时的含义。我相信问题中的代码不会有问题,因为dynamicINT它具有固定值。但也许在实际代码中它可能会有所不同。在这种情况下,您可能会遇到实现定义或未定义的行为。

我怀疑您应该在这里使用无类型变量。我会Cardinal在 Delphi 代码和unsigned intC++ 代码中使用这些变量。

于 2014-05-20T07:27:17.703 回答
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 单元文件。只需尝试将其中一个添加到您的项目中(这样您就可以进行迁移 - 如果仍然需要 - 一步一步)。

于 2014-05-21T08:48:52.577 回答