3

ここに、Turbo Delphi 2006 でコンパイルおよびテストした Delphi 3 で正常に動作するプログラムがあり、問題が見つかりました。問題は次のとおりです。「カーディナル」データ型を何かのインデックスとして使用していました。それは Delphi 3 で動作しましたが、特定のデータに応じて、Turbo Delphi 2006 でコンパイルされたバージョンよりも値が約 128 ~ 256 大きいことがわかりました。これらのデータ型を「longint」に変更すると問題が修正され、プログラムは両方のコンパイラで正しく動作しました。

質問:これはなぜですか?

私の理解では、基数データ型は典型的な符号なし整数データに過ぎないということでした。これは、このプログラムでのそれらの適用と一致しており、特に Delphi 3 のコンパイルが正しく機能したという事実によって証明されています。では、Turbo Delphi 2006 のコンパイルが機能しなかったのはなぜでしょうか?

4

1 に答える 1

5

Delphi では、符号なしの型は、次に大きい符号付きの型のサブレンジ型にすぎません。Delphi 3 には 64 ビット型がないため、Cardinal がサブレンジになる次の大きな型はありません。Cardinal は、言語の技術的な制限により、Delphi 3 では符号付きの型です。Delphi 4 では Int64 が導入され、Cardinal はその型の符号なし部分範囲になるように作成されました(そして、符号なし 64 ビット型ではないという制限がありました)。

要するに、最初から真の署名なしの動作を取得することはありませんでした。アップグレードしたので、コードに常に存在していた長年の問題が明らかになりました。

コードがコンパイルされたからといって、コードが正しかったという証拠にはなりません。Delphi 3 は、実際には存在しないタイプを必要とするルールを適用できません。

于 2012-12-20T13:12:49.400 に答える