2

私はこれを研究するのに何時間も費やしましたが、かなり行き詰まっています:私の質問は-Delphi TDateTimeの内部形式はDelphi7(2002年頃にリリースされた)と今日の間で変更されましたか?

シナリオ:Delphi 7アプリによって作成されたバイナリログファイルを読んでいて、ベンダーはそれがレコード内のTDateTimeであると言っていますが、ビットをデコードすると、最新のDelphiによって生成されたTDateTimeが標準のIEEE754浮動小数点ではないことが明らかになります。 。

しかし、これは、約15ビットの指数と45ビットの仮数(IEE754の11ビットと53ビットとは対照的)を持つある種の浮動小数点であり、先頭のビットは1(IEE754では負の数を示します)です。現在の日付/時刻など、明らかにマイナスではありません。

古いドキュメントのヒントは、TDateTimeがdoubleとして「読み取られる」ことを示唆していましたが、必ずしも内部的に1として表されるわけではありませんでした。つまり、これらのTDateTimeがバイナリ形式で書き出された場合を除いて、内部形式はほとんど見えません。

私の疑いは、変更が.NETサポートを追加したDelphi 8で発生したことですが、これへの参照はどこにも見つかりません。私はこれらのタイプを区別するperlコード(!)を持っていますが、それを適切に実行できるように、正式な仕様を見つけたいと思います。

昔の人はこれに遭遇しますか?

~~~スティーブ

4

2 に答える 2

4

Delphi 7以降、何も変更されていません。Delphi7、および実際には以前のバージョンでは、TDateTimeはIEEE754であり、Delphiエポックからの日数を測定します。

ソフトウェアベンダーと連絡を取り、このデータの形式が実際に何であるかを理解する必要があります。フォーマットが非IEEE754浮動小数点データ型である場合は驚くべきことです。浮動小数点であると確信していますか?

于 2012-12-16T18:39:11.853 に答える
0

BCB3、BCB6、およびD4に関しては、これはまさにIEEE 754倍精度浮動小数点形式であり、VCLソースファイルsystem.pas(BCB6に含まれている)では、次のように定義されています。

TDateTime = type Double;
于 2014-02-06T11:38:56.970 に答える