在 Win64 环境中迁移 Delphi Win32 的 Extended 数据类型

欢迎加入全网最大Delphi 技术交流群 682628230

在 Delphi 中,Extended 数据类型在 Win32 和 Win64 平台上有不同的实现。Win32 中的 Extended 是 10 字节的浮点数,而 Win64 中的 Extended 是 8 字节的浮点数。为了在 Win64 环境中读取 Win32 应用程序生成的 10 字节 Extended 数据,并转换为 8 字节的浮点数(接受精度损失),可以使用 TExtended80Rec 类型和 TExtendedHelper

 

  1. 1. 使用 TExtended80Rec 读取 10 字节数据
    • • TExtended80Rec 是一个 10 字节的记录类型,用于处理 80 位浮点数。
    • • 可以从文件中读取 10 字节数据到 TExtended80Rec 类型的变量中,然后通过显式类型转换将其转换为 Extended 或 Double
  2. 2. 跨平台兼容性
    • • 为了确保跨平台兼容性,建议在代码中使用 Double 类型,因为它在所有平台上都支持。

代码实现

以下是一个简单的函数,用于从流中读取 80 位浮点数并转换为 Double 值:

function Read80BitExtended(Stream: TStream): Double;
var
  Value: TExtended80Rec;
begin
  Stream.ReadBuffer(Value, SizeOf(Value));
  Result := Extended(Value);
end;

注意事项

  • • 如果读取的值超出了 Double 的范围,可能会触发浮点溢出错误。在 Delphi 12 之前的版本中,默认情况下会抛出异常,而在 Delphi 12 中,浮点异常默认被屏蔽,不会抛出异常。

更兼容的数据类型

为了确保跨平台兼容性,建议使用以下数据类型:

  • • Double 和 Single:这些是 IEEE 754-1985 标准的浮点数类型,被许多编程语言支持,是行业标准。
  • • 自定义数据类型:如果对数据的存储和读取有最高优先级,可以使用整数类型来存储浮点数的符号、指数和分数部分,例如:
    • • 4 字节符号/尾数(1 个 Cardinal)
    • • 4 字节指数(1 个 Cardinal)
    • • 8 字节分数(2 个 Cardinal)

 

  • • 使用 TExtended80Rec 可以读取 Win32 应用程序生成的 10 字节 Extended 数据,并转换为 Win64 支持的 8 字节浮点数。
  • • 为了确保跨平台兼容性,建议在代码中使用 Double 类型。
  • • 如果需要更高的兼容性,可以考虑使用自定义的数据类型来存储浮点数。

 

 

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享