gpt4 book ai didi

delphi - 为什么将 single 分配给变体会产生 varDouble 变体?

转载 作者:行者123 更新时间:2023-12-03 14:48:47 25 4
gpt4 key购买 nike

uses
SysUtils, Variants;

var
VariantSingle: Variant;
VTSingle: TVarType;
SingleTest: Single;
VariantDouble: Variant;
DoubleTest: Double;
VTDouble: TVarType;

begin
SingleTest := 1.234;
VariantSingle := SingleTest;
VTSingle := VarType(VariantSingle) and varTypeMask;

DoubleTest := 1.23456;
VariantDouble := DoubleTest;
VTDouble := VarType(VariantDouble) and varTypeMask;

WriteLn(Format('VarType: Single: %d, Double %d', [VTSingle, VTDouble]));
end.

上面的代码将输出:

VarType: Single: 5, Double 5

来自 System.pas

varSingle   = $0004; { vt_r4           4 }
varDouble = $0005; { vt_r8 5 }

因此,我希望 VTSingle 为 4 - 而不是 5
我错过了什么?

最佳答案

Delphi 库选择通过调用_VarFromReal 来实现对变体的所有浮点赋值。该函数如下所示:

procedure _VarFromReal(var V: TVarData; const Value: Real);
begin
if (V.VType and varDeepData) <> 0 then
VarClearDeep(V);
V.VType := varDouble;
V.VDouble := Value;
end;

请注意,这使用了 varDouble 类型。并包括到 Real 的隐式转换,这是 Double 的别名。我不确定设计师为什么选择这条特定路线,但该选择的结果就是您观察到的行为。

制作您可以使用的 varSingle 变体的简单方法:

VariantSingle := VarAsType(SingleTest, varSingle);

尽管这会将 SingleTest 转换为 Double,然后再转换回 Single

为了避免不必要的转换,请编写自己的帮助程序:

function VarFromSingle(const Value: Single): Variant;
begin
VarClear(Result);
TVarData(Result).VSingle := Value;
TVarData(Result).VType := varSingle;
end;

你可以这样调用:

VariantSingle := VarFromSingle(SingleTest);

我认为后一种方法是正确的解决方案。

关于delphi - 为什么将 single 分配给变体会产生 varDouble 变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15133496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com