我意识到,在投放到Boolean
时,不应期望真正的1
成为Integer
,纯粹是因为它们变为非0
。
但是,结果会根据变量是Variant
(varBoolean
)还是Boolean
而变化。
请考虑以下事项:
I := Integer(true);
I
现在是1
。
但是...
var
I: Integer;
V: Variant;
begin
V := true;
I := Integer(V);
end;
I
现在是-1
。
当然,如果我在将生成的Boolean
转换为Boolean
之前将V投放到Integer
,I
会变为-1
。
但我很好奇为什么会这样。
这是因为存储Boolean
的方式(比如1
位),并且在转换为Integer
时,Delphi执行转换,当转换时不会发生转换将Variant
投射到Integer
?
我只提出这个问题,因为如果您已经习惯了Boolean
1
varBoolean
,那么varInteger
与VarType()
分享案例可能会很危险case
- case VarType(V) of
varInteger, varBoolean: I := Integer(V);
end;
。
例如:
--recursive
不会像人们预期的那样表现。
答案 0 :(得分:11)
行为确实如预期。 varBoolean
类型对应VT_BOOL
。这是documented这样的:
<强> VT_BOOL 强>
布尔值。 True为-1,false为0。
你也说Delphi的布尔值存储为1位。事实并非如此。它们存储在一个字节,8位。我想关键点是VT_BOOL
变体不包含Delphi Boolean
。 VT_BOOL
变体是一个完全不同的野兽,最初来自VB。 Raymond Chen在这里讨论了一点:BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool。
答案 1 :(得分:-1)
这是一个旧线程,但是我想我会添加一点不一致之处,因为SysUtils.BoolToStr()函数默认情况下返回“ -1”为true和“ 0”为false。
为了使事情更加混乱,如果字符串是任意数字(甚至是浮点数)都不为0,则SysUtils.StrToBool()返回true。