お世話になります。
ちょっとした疑問なのですが。
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;
が用意されているということでしょうか?
わかる方よろしくお願いします。
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ということになります。
遅くなって申し訳ないです。
torb ありがとうございます。
単に移植といってもいろいろと違ってくるものですね。
同じ関数を使用してもこのように違いが出るのであれば、
移植後はいろいろとバグが発生出てきそうで不安です。
それでは失礼します。
ツイート | ![]() |