【问题标题】:delphi to C++ builder conversiondelphi 到 C++ builder 的转换
【发布时间】:2014-07-08 07:55:15
【问题描述】:

我在 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++ 生成器结果:0001 ???

转换有什么问题?

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

【问题讨论】:

  • 你为什么要移植? C++-Builder 有“板载 Delphi”...

标签: delphi c++builder boolean-operations binary-operators


【解决方案1】:

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

试试:

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

【讨论】:

  • 天啊...非常感谢马特。我很感激
【解决方案2】:

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

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

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

我怀疑您应该在这里使用无类型变量。我在 Delphi 代码中将这些变量设为 Cardinal,在 C++ 代码中将这些变量设为 unsigned int

【讨论】:

    【解决方案3】:

    除了Mat's answer,它可能会帮助您了解在C/C++ 中,与Delphi/Pascal 不同,任何bool 值都是可互换的 与所有整数和数字类型。以下废话示例不会引起编译器的任何警告:

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

    ...最后但同样重要的是:您可以在 C++-Builder 项目中使用未更改的 Delphi 单元文件。 只需尝试将其中一个添加到您的项目中(这样您就可以进行迁移- 如果仍然需要 - 一步一步)。

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多