为什么delphi BoolToStr为true表示为-1

Doe*_*ege 5 delphi pascal boolean

Delphi函数BoolToStr将布尔值转换为字符串.

结果为true或false,或分别为"numeric"," - 1"和"0".为什么-1而不是1?

Gol*_*rol 8

可能的解释是布尔值通常不存储在单个位中,而是存储在整数中.如果按顺序not执行整数0(二进制0000 0000 ...),它将是二进制1111 1111 ....),这意味着-1表示两个补码有符号整数.

所以,如果你说,false := 0; true := not false;那么真的是-1是有道理的.

在各种BASIC方言中,出于同样的原因,true也是-1.

  • @David:确实经常这样。<g> (2认同)
  • Lazarus使用早期的glib / gtk2标头对此感到很有趣。它们的布尔类型类似于pascal的类型,但随后是32位。使用longbool时会得出true -1,但是gtk2在内部会检查true = 1,因此传递的布尔值永远不会为true。因此,现在FPC具有boolean16,boolean32,boolean64(旧的布尔值为boolean8) (2认同)

Dav*_*nan 7

这些特定值的源是肯定下降到0-1可由所述COM布尔类型中使用的值.

当然在Delphi RTL的旧版本中,在将变体从一种类型转换为另一种类型时使用了这个函数,所以我有理由相信COM变体支持是这个决定背后的原因.

你可以看到今日的原代码的残部VariantChangeSimpleIntoSimple中发现的System.VarUtils.当被要求转换varBooleanvarOleStr它时:

VarOleStrFromStr(Dest, BoolToStr(LSource.VBoolean))
Run Code Online (Sandbox Code Playgroud)

进一步阅读: