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

标签 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()

最佳答案

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

Dim value As Boolean = CBool(-1) ' True
Dim value1 As Boolean = CBool(1) ' True
Dim value2 As Boolean = CBool(0) ' False

但是,正如您所指出的,任何时候您都可以使用 Boolean设置为 TrueInteger ,它将评估为 -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/

相关文章:

mysql - 从 MySQL 数据 VB.NET 填充 datagridview 中的特定列

vb.net - 对于 ComboBox 使用 SelectedIndex 或 SelectedItem 更好?

c# - 从常规注释生成 XML 注释

c# - 在 Visual Studio 中使用参数 Access 查询

vb.net - 与 VB .net Lambdas 斗争

vb.net - ALTER TABLE 能否接受 Access 2010 中的查询结果

c# - 如何轻松否定 MS Report 中的表达式?

vb.net - 从 Excel 工作簿获取ActiveObject

.net - 如何将自定义类的通用列表绑定(bind)到 datagridview 并仅在 VB.NET 中显示特定属性?

javascript - 使用代码隐藏中的值调用 javascript 函数