vb.net – 为什么True等于-1

我想知道为什么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,正如你所期望的那样(第一个位是符号位,其余的是正常值),是因为它被存储为二进制补码.将负数存储为二进制补码意味着算术运算要更容易处理器执行.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...