为什么delphi BoolToStr true 表示为-1
Why delphi BoolToStr true is represented as -1
Delphi 函数 BoolToStr 将布尔值转换为字符串。
结果为 true 或 false,或者分别为 'numeric'、'-1' 和 '0'。为什么是 -1 而不是 1?
这些特定值的来源肯定是 0
和 -1
是 COM 布尔类型使用的值。
当然,在旧版本的 Delphi RTL 中,将变体从一种类型转换为另一种类型时会使用此函数,因此我有理由相信 COM 变体支持是该决定背后的原因。
您现在可以在 System.VarUtils
中的 VariantChangeSimpleIntoSimple
中看到该原始代码的残余。当要求将 varBoolean
转换为 varOleStr
时,它执行:
VarOleStrFromStr(Dest, BoolToStr(LSource.VBoolean))
进一步阅读:
一个可能的解释是,布尔值通常不是存储在单个位中,而是存储在整数中。如果您对整数 0(二进制 0000 0000 ...)执行按位 not
,它将是二进制 1111 1111 ....),这意味着 -1 表示两个补码有符号整数。
因此,如果您说 false := 0; true := not false;
,则 true 为 -1 是有道理的。
在各种BASIC方言中,出于同样的原因,true也是-1。
Delphi 函数 BoolToStr 将布尔值转换为字符串。
结果为 true 或 false,或者分别为 'numeric'、'-1' 和 '0'。为什么是 -1 而不是 1?
这些特定值的来源肯定是 0
和 -1
是 COM 布尔类型使用的值。
当然,在旧版本的 Delphi RTL 中,将变体从一种类型转换为另一种类型时会使用此函数,因此我有理由相信 COM 变体支持是该决定背后的原因。
您现在可以在 System.VarUtils
中的 VariantChangeSimpleIntoSimple
中看到该原始代码的残余。当要求将 varBoolean
转换为 varOleStr
时,它执行:
VarOleStrFromStr(Dest, BoolToStr(LSource.VBoolean))
进一步阅读:
一个可能的解释是,布尔值通常不是存储在单个位中,而是存储在整数中。如果您对整数 0(二进制 0000 0000 ...)执行按位 not
,它将是二进制 1111 1111 ....),这意味着 -1 表示两个补码有符号整数。
因此,如果您说 false := 0; true := not false;
,则 true 为 -1 是有道理的。
在各种BASIC方言中,出于同样的原因,true也是-1。