我意识到人们不应该期望真正的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,德尔福执行转换,铸造时不发生Variant到Integer?
我只提出这个问题,因为如果你习惯了真正的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.
| 归档时间: |
|
| 查看次数: |
1587 次 |
| 最近记录: |