为什么True等于-1

the*_*tus 12 vb.net

我想知道为什么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()
Run Code Online (Sandbox Code Playgroud)

Ste*_*art 26

当您将任何非零数字转换为a时Boolean,它将评估为True.例如:

Dim value As Boolean = CBool(-1) ' True
Dim value1 As Boolean = CBool(1) ' True
Dim value2 As Boolean = CBool(0) ' False
Run Code Online (Sandbox Code Playgroud)

但是,正如您所指出的,无论何时将a Boolean设置True为an Integer,它都会计算为-1,例如:

Dim value As Integer = CInt(CBool(1)) ' -1
Run Code Online (Sandbox Code Playgroud)

原因是因为-1是有符号整数值,其中所有位都等于1.由于a Boolean存储为16位整数,因此只需简单地将所有位都切换为更容易在真状态和错误状态之间切换.比特而不仅仅是不是最重要的比特.换句话说,为了True成为1,它必须像这样存储:

True  = 0000000000000001
False = 0000000000000000
Run Code Online (Sandbox Code Playgroud)

但是像这样存储它更容易:

True  = 1111111111111111
False = 0000000000000000
Run Code Online (Sandbox Code Playgroud)

它更容易的原因是因为,在低级别:

1111111111111111 = NOT(0000000000000000)
Run Code Online (Sandbox Code Playgroud)

鉴于:

0000000000000001 <> NOT(0000000000000000)
0000000000000001 = NOT(1111111111111110)
Run Code Online (Sandbox Code Playgroud)

例如,您可以使用如下Int16变量复制此行为:

Dim value As Int16 = 0
Dim value2 As Int16 = Not value
Console.WriteLine(value2) ' -1
Run Code Online (Sandbox Code Playgroud)

如果使用无符号整数,这将更加明显,因为那时,值True是最大值而不是-1.例如:

Dim value As UInt16 = CType(True, UInt16) ' 65535
Run Code Online (Sandbox Code Playgroud)

那么,真正的问题是,为什么VB.NET使用16位来存储单个位值.真正的原因是速度.是的,它使用了16倍的内存量,但处理器可以比单位布尔运算快得多地执行16位布尔运算.

旁注:将Int16-1存储为1111111111111111而不是1000000000000001像您预期的那样(第一位将是"符号位",其余将是值)的原因是因为它存储为两者的-补充.将负数存储为二进制补码意味着算术运算对于处理器来说更容易执行.它也更安全,因为有两个赞美,没有办法表示0为负数,这可能会导致各种混乱和错误.