为什么真正的变体布尔值在转换为整数时变为-1?

时间:2015-08-05 09:18:57

标签: delphi

我意识到,在投放到Boolean时,不应期望真正的1成为Integer,纯粹是因为它们变为非0

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

请考虑以下事项:

I := Integer(true);

I现在是1

但是...

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

I现在是-1

当然,如果我在将生成的Boolean转换为Boolean之前将V投放到IntegerI会变为-1

但我很好奇为什么会这样。

这是因为存储Boolean的方式(比如1位),并且在转换为Integer时,Delphi执行转换,当转换时不会发生转换将Variant投射到Integer

我只提出这个问题,因为如果您已经习惯了Boolean 1 varBoolean,那么varIntegerVarType()分享案例可能会很危险case - case VarType(V) of varInteger, varBoolean: I := Integer(V); end;

例如:

--recursive

不会像人们预期的那样表现。

2 个答案:

答案 0 :(得分:11)

行为确实如预期。 varBoolean类型对应VT_BOOL。这是documented这样的:

  

<强> VT_BOOL

     

布尔值。 True为-1,false为0。

你也说Delphi的布尔值存储为1位。事实并非如此。它们存储在一个字节,8位。我想关键点是VT_BOOL变体不包含Delphi BooleanVT_BOOL变体是一个完全不同的野兽,最初来自VB。 Raymond Chen在这里讨论了一点:BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool

答案 1 :(得分:-1)

这是一个旧线程,但是我想我会添加一点不一致之处,因为SysUtils.BoolToStr()函数默认情况下返回“ -1”为true和“ 0”为false。

为了使事情更加混乱,如果字符串是任意数字(甚至是浮点数)都不为0,则SysUtils.StrToBool()返回true。