当您将任何非零数字转换为Boolean 时,它的计算结果将是True。例如:
Dim value As Boolean = CBool(-1) ' True
Dim value1 As Boolean = CBool(1) ' True
Dim value2 As Boolean = CBool(0) ' False
但是,正如您所指出的,每当您将设置为 True 的 Boolean 转换为 Integer 时,它将评估为 -1,例如:
Dim value As Integer = CInt(CBool(1)) ' -1
这是因为-1 是所有位都等于 1 的有符号整数值。由于 Boolean 存储为 16 位整数,因此更容易在 true 和通过简单地不处理所有位而不是仅不处理最不重要的位来实现错误状态。换句话说,为了使True 成为1,它必须像这样存储:
True = 0000000000000001
False = 0000000000000000
但是像这样存储它更容易:
True = 1111111111111111
False = 0000000000000000
它更容易的原因是,在低级别:
1111111111111111 = NOT(0000000000000000)
鉴于:
0000000000000001 <> NOT(0000000000000000)
0000000000000001 = NOT(1111111111111110)
例如,您可以使用 Int16 变量复制此行为,如下所示:
Dim value As Int16 = 0
Dim value2 As Int16 = Not value
Console.WriteLine(value2) ' -1
如果您使用无符号整数,这会更明显,因为那时True 的值是最大值而不是-1。例如:
Dim value As UInt16 = CType(True, UInt16) ' 65535
那么,真正的问题是,为什么 VB.NET 使用 16 位来存储单个位值。真正的原因是速度。是的,它使用了 16 倍的内存量,但处理器执行 16 位布尔运算的速度要比执行单位布尔运算快得多。
旁注:-1 的 Int16 值存储为 1111111111111111 而不是 1000000000000001 的原因,如您所料(其中第一位是“符号位”,而rest 将是值),因为它被存储为二进制补码。将负数存储为二进制补码意味着处理器更容易执行算术运算。它也更安全,因为使用 two's-compliment 时,无法将 0 表示为负数,这可能会导致各种混乱和错误。