加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 为什么当转换为整数时,真正的变体布尔变为-1?

发布时间:2020-12-15 04:17:46 所属栏目:大数据 来源:网络整理
导读:我意识到人们不应该期望真正的布尔人在被转换为整数时变为1,纯粹是他们变为非0. 但是,结果会根据变量是变量(但是varBoolean)还是布尔值而变化. 考虑以下: I := Integer(true); 我现在1岁. 但… var I: Integer; V: Variant;begin V := true; I := Integer(V
我意识到人们不应该期望真正的布尔人在被转换为整数时变为1,纯粹是他们变为非0.

但是,结果会根据变量是变量(但是varBoolean)还是布尔值而变化.

考虑以下:

I := Integer(true);

我现在1岁.

但…

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

我现在是-1.

当然,如果在将生成的布尔值转换为整数之前将V转换为布尔值,则变为-1.

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

这是因为布尔值的存储方式(比如1位),当转换为整数时,Delphi执行转换,在将Variant转换为Integer时不会发生转换?

我只提出这个问题,因为如果你习惯于将一个真正的布尔值转换为1,那么在varType() – case中使用varInteger的varBoolean共享案例可能会很危险.

例如:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读