質問です。

解決


シュナイダー  2009-02-20 20:39:06  No: 33420

お世話になります。
ちょっとした疑問なのですが。

IntToStrのヘルプ(Delphi7)で(以下抜粋)
---------------------------------------------------------------------
IntToStr 関数は,整数を文字列に変換します。

ユニット

SysUtils

分野の指定

数値形式ルーチン

Delphi の構文:

function IntToStr(Value: Integer): string; overload;
function IntToStr(Value: Int64): string; overload;

C++ の構文:

extern PACKAGE AnsiString __fastcall IntToStr(int Value);
extern PACKAGE AnsiString __fastcall IntToStr(__int64 Value);

説明

IntToStr 関数は,整数を 10 進表現の文字列に変換します。
---------------------------------------------------------------------

と、書かれています。
今DelphiからC++Builderに移植してます
Delphi,C+Builder それぞれ以下のようなコードを記述した場合

☆Delphiの場合
var
  DData: DWord;
begin
  DData := $FFFFFFFF;
  Edit1.Text := IntToStr(DData);
end;

☆移植したC++Builderの場合
{
  DWord DData = 0xFFFFFFFF;
  Edit1->Text = IntToStr(DData);
}

Delphiは 4294967295 を返すのに
Builderは -1 を返します。

現状仕方がないので
Edit1->Text = IntToStr((INT64)DData);
のように変換しています。

そこで、質問なのですが、
DelphiとBuilderではどうして違うのでしょうか?
Delphiにはさらに
function IntToStr(Value: DWord): string; overload;
が用意されているということでしょうか?

わかる方よろしくお願いします。


torb  2009-02-21 09:02:57  No: 33421

DelphiとCの言語仕様の違いによるものでしょうね。
C++の場合、signedとunsignedには同じビット値をどう解釈するかという
違いしかありません。符号つきでも符号なしでもintはintなので
intの方のオーバーロードが選択されます。

一方Pascalでは、整数は厳密に範囲を持つ型として定義されています。
DWord: 0..4294967295
Integer: -2147483648..2147483647
Int64: -2^63..2^63-1
Delphiでオーバーロードを解決する際には、
パラメータに適合する最も小さな範囲の型が選択されます。
(ヘルプの「手続きと関数のオーバーロード」を参照)
この場合、Integerは適合しない(DWordの全範囲を含んではいない)ので、
適合する最も小さな範囲の型はInt64ということになります。


シュナイダー  2009-02-25 18:53:28  No: 33422

遅くなって申し訳ないです。

torb  ありがとうございます。
単に移植といってもいろいろと違ってくるものですね。
同じ関数を使用してもこのように違いが出るのであれば、
移植後はいろいろとバグが発生出てきそうで不安です。

それでは失礼します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加