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++ ビルダーの結果: 0001???

変換の何が問題になっていますか?

C++ Builder 6 と Delphi 7 を使用しています

4

3 に答える 3

8

||and&&は、C++ の論理演算子であり、ビット単位の演算子ではありません。true/false のみを返します。対応する二項演算子は|&です。

試す:

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

Mat の回答に加えて、Delphi/Pascal とは対照的に、C/C++ では、任意のbool値がすべての整数型および数値型と交換可能であることを知っておくと、移植に役立つ場合があります。次の意味のない例では、コンパイラによる警告は発生しません。

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

...そして最後になりましたが、C++-Builder プロジェクトでは Delphi ユニット ファイルを変更せずに使用できます。それらの1つをプロジェクトに追加してみてください(この方法で、移行を行うことができます-まだ必要な場合-段階的に).

于 2014-05-21T08:48:52.577 に答える