【问题标题】:Why is True equal to -1为什么 True 等于 -1
【发布时间】:2013-01-05 21:39:55
【问题描述】:

我想知道为什么 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 将所有位设置为 1。对于所有有符号整数类型,这恰好等于 -1。
  • 在 C 中,false 等于 0。任何其他值为 true,包括 -1。请注意 -1 等于 not 0 使用二进制 not
  • 您真的应该考虑将OPTION STRICT 设置为true。没有理由需要从 Int32Boolean 的隐式转换或任何其他为严重错误打开大门的魔法转换。 Strict 还具有您开始学习 .NET 类型并且符合 C# 的优势。

标签: vb.net


【解决方案1】:

当您将任何非零数字转换为Boolean 时,它的计算结果将是True。例如:

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

但是,正如您所指出的,每当您将设置为 TrueBoolean 转换为 Integer 时,它将评估为 -1,例如:

Dim value As Integer = CInt(CBool(1)) ' -1

这是因为-1 是所有位都等于 1 的有符号整数值。由于 Boolean 存储为 16 位整数,因此更容易在 true 和通过简单地不处理所有位而不是仅不处理最不重要的位来实现错误状态。换句话说,为了使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 位布尔运算的速度要比执行单位布尔运算快得多。

旁注:-1Int16 值存储为 1111111111111111 而不是 1000000000000001 的原因,如您所料(其中第一位是“符号位”,而rest 将是值),因为它被存储为二进制补码。将负数存储为二进制补码意味着处理器更容易执行算术运算。它也更安全,因为使用 two's-compliment 时,无法将 0 表示为负数,这可能会导致各种混乱和错误。

【讨论】:

  • 很好的答案!我从没想过NOT(1) &lt;&gt; 0 会是个问题。
【解决方案2】:

是大多数语言,数值0为假。其他一切都被认为是真实的。如果我没记错的话,-1 实际上是所有位都设置为 1,而 0 是所有位都设置为 0。我想这就是原因。

【讨论】:

  • 是的,你会在“真”中看到很多“非零”字样
【解决方案3】:

在 Visual Basic 中,0False,而任何非零值都是 True。另外,根据MSDN

当 Visual Basic 将数值数据类型值转换为布尔值时,0 变为 False,所有其他值变为 True。当 Visual Basic 将布尔值转换为数值类型,False 变为 0 和 True 变为-1。

【讨论】:

    【解决方案4】:

    这是可能的重复:Casting a boolean to an integer returns -1 for true?

    布尔常量 True 的数值为 -1。这是因为布尔数据类型存储为 16 位有符号整数。在此构造中,-1 计算为 16 个二进制 1(布尔值 True),0 计算为 16 个 0(布尔值 False)。这在对 16 位有符号整数值 0 执行 Not 操作时很明显,这将返回整数值 -1,换句话说,True = Not False。当对整数的各个位执行逻辑运算时,这种固有功能变得特别有用,例如 And、Or、Xor 和 Not。 [4] True的这个定义也与1970年代早期微软BASIC实现以来的BASIC一致,也与当时CPU指令的特点有关。

    【讨论】:

      【解决方案5】:

      我想回到汇编语言,将条件转换为比较 cmp 操作并检查零标志 (ZF)。对于真正的表达式,ZF 不会被提升,而对于错误的表达式,它会被提升。早期的英特尔处理器就是这样,但我不记得 Zilog Z80 和摩托罗拉 8 位处理器是否有相同的约定。

      【讨论】:

        猜你喜欢
        • 2014-07-04
        • 2016-09-17
        • 2021-10-08
        • 1970-01-01
        • 2013-08-17
        • 2014-02-16
        • 1970-01-01
        • 2022-04-12
        • 1970-01-01
        相关资源
        最近更新 更多