gpt4 book ai didi

delphi - 为什么真正的变体 bool 值在转换为整数时会变成 -1?

转载 作者:行者123 更新时间:2023-12-03 15:06:46 33 4
gpt4 key购买 nike

我意识到,当转换为Integer时,人们不应该期望真正的Boolean会变成1,纯粹是它们变成了非0

但是,结果会根据变量是 Variant(但 varBoolean)还是 Boolean 而变化。

考虑以下因素:

I := Integer(true);

I 现在是 1

但是...

var
I: Integer;
V: Variant;
begin
V := true;
I := Integer(V);
end;

I 现在是 -1

当然,如果我在将生成的 Boolean 转换为 Integer 之前将 V 转换为 Boolean,则 I > 变为 -1

但我很好奇这是为什么。

这是因为 Boolean 的存储方式(例如 1 位)以及当转换为 Integer 时,Delphi执行转换,而将 Variant 转换为 Integer 时不会发生这种转换?

我只是提出这一点,因为如果您习惯将真正的 Boolean 转换为 1,那么使用 varBoolean 可能会很危险与 VarType()-case 中的 varInteger 共享 case。

例如:

case VarType(V) of 
varInteger, varBoolean: I := Integer(V);
end;

不会像人们想象的那样表现。

最佳答案

行为确实符合预期。 varBoolean 类型对应于VT_BOOL。这是 documented像这样:

VT_BOOL

A Boolean value. True is -1 and false is 0.

你还说Delphi的 bool 值存储为1位。这实际上不是真的。它们存储在单个字节(8 位)中。我认为关键点是 VT_BOOL 变体不包含 Delphi BooleanVT_BOOL 变体是完全不同的野兽,最初可以追溯到 VB。 Raymond Chen 在这里对此进行了一些讨论:BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool .

关于delphi - 为什么真正的变体 bool 值在转换为整数时会变成 -1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31828307/

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