当您将任何非零数字转换为Boolean
,它将评估为True
。例如:
Dim value As Boolean = CBool(-1) ' True
Dim value1 As Boolean = CBool(1) ' True
Dim value2 As Boolean = CBool(0) ' False
然而,正如您所指出的,任何时候您施放Boolean
即设置为True
to an Integer
,它将计算为 -1,例如:
Dim value As Integer = CInt(CBool(1)) ' -1
这样做的原因是因为-1
是有符号整数值,其中所有位都等于 1。Boolean
存储为 16 位整数,通过简单地对所有位进行 NOT 操作而不是仅对最低有效位进行 NOT 操作,可以更轻松地在 true 和 false 状态之间切换。换句话说,为了True
to be 1
,它必须像这样存储:
True = 0000000000000001
False = 0000000000000000
但像这样存储它更容易:
True = 1111111111111111
False = 0000000000000000
它更容易的原因是,在低层次上:
1111111111111111 = NOT(0000000000000000)
Whereas:
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 位布尔运算的速度比执行单位布尔运算的速度要快得多。
旁注:原因Int16
的价值-1
存储为1111111111111111
而不是作为1000000000000001
正如您所期望的(其中第一位是“符号位”,其余的是值),是因为它存储为二进制补码。将负数存储为补码意味着处理器更容易执行算术运算。它也更安全,因为在两个人的赞美中,没有办法代表0
作为负数,这可能会导致各种混乱和错误。