我想知道为什么 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()
最佳答案
当您将任何非零数字转换为 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
到 Integer
,它将评估为 -1,例如:Dim value As Integer = CInt(CBool(1)) ' -1
这是因为
-1
是所有位都等于 1 的有符号整数值。由于 Boolean
存储为 16 位整数,通过简单地不处理所有位而不是只不处理最低有效位,更容易在真和假状态之间切换。换句话说,为了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 位 bool 运算的速度比执行单位 bool 运算快得多。
旁注:
Int16
的原因-1
的值存储为 1111111111111111
而不是 1000000000000001
,正如您所料(其中第一位是“符号位”,其余的将是值),因为它存储为二进制补码。将负数存储为二进制补码意味着处理器执行算术运算要容易得多。它也更安全,因为用两个人的赞美,没有办法代表 0
作为负数,这可能会导致各种困惑和错误。
关于vb.net - 为什么 True 等于 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14462272/