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

Svi*_*vip 5 delphi

我意识到人们不应该期望真正的Booleans成为1一个Integer纯粹的他们变成非0.

但是,结果会根据变量是否为Variant(但varBoolean)或a而变化Boolean.

考虑以下:

I := Integer(true);
Run Code Online (Sandbox Code Playgroud)

I现在1.

但...

var
  I: Integer;
  V: Variant;
begin
  V := true;
  I := Integer(V);
end;
Run Code Online (Sandbox Code Playgroud)

I现在-1.

当然,如果我投V到一个Boolean铸造所产生的前Boolean一个Integer,I变成-1.

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

这是因为,该方式Booleans的存储(说的那样1位),以及铸造的时候Integer,德尔福执行转换,铸造时不发生VariantInteger

我只提出这个问题,因为如果你习惯了真正的Boolean铸造1,那么在- 中varBoolean分享案例可能是危险的.varIntegerVarType()case

例如:

case VarType(V) of 
  varInteger, varBoolean: I := Integer(V);
end;
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*nan 11

这种行为确实如预期的那样.的varBoolean类型对应于VT_BOOL.这是记录如下:

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.

  • 这不是发生的事情.Delphi的`Boolean`是一个8位值,一个字节.当你写'b:= False`时,`b`被设置为'0`.当你写'b:= True`时,`b`被设置为`1`.在二进制文件中是'00000001`. (6认同)