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