■ 質問です。

[Delphi Q & A 掲示板] [過去ログの一覧]


シュナイダー 2009/02/20(金) 11:39:06
お世話になります。
ちょっとした疑問なのですが。

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(土) 00:02:57
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(水) 09:53:28
[[解決]]

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

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

それでは失礼します。

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library