我想知道为什么True等于-1而不是1.如果我记得在C中正确(在日子里),“true”将等于1.
Dim t,f As Integer t = True f = False Console.WriteLine(t) ' -1 Console.WriteLine(f) ' 0 Console.ReadLine()
当您将非零数字转换为布尔值时,它将评估为True.例如:
Dim value As Boolean = CBool(-1) ' True Dim value1 As Boolean = CBool(1) ' True Dim value2 As Boolean = CBool(0) ' False
但是,正如你所指出的,任何时间你将一个Boolean设置为True到一个整数,它将评估为-1,例如:
Dim value As Integer = CInt(CBool(1)) ' -1
原因是因为-1是其所有位等于1的有符号整数值.由于布尔值作为16位整数存储,所以简单的NOT’所有这些位,而不是只有不是最低有效位.换句话说,为了使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的原因是存储为1111111111111111而不是1000000000000001,正如你所期望的那样(第一个位是符号位,其余的是正常值),是因为它被存储为二进制补码.将负数存储为二进制补码意味着算术运算要更容易处理器执行.