14

我想知道为什么 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()
4

5 回答 5

32

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

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

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

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

这样做的原因是因为-1它的所有位都等于 1 的有符号整数值。由于 aBoolean存储为 16 位整数,因此通过简单地不处理所有这些位,而不是仅不考虑最低有效位。换句话说,为了Truebe 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 位布尔运算的速度要比执行单位布尔运算快得多。

旁注:正如您所料(其中第一位是“符号位”,其余位是值),值存储为而不是 as 的原因是因为它Int16存储-11111111111111111两个1000000000000001-补充。将负数存储为二进制补码意味着处理器更容易执行算术运算。它也更安全,因为使用双的恭维,没有办法表示0为负数,这可能会导致各种混乱和错误。

于 2013-01-22T15:41:58.533 回答
2

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

于 2013-01-22T15:39:27.247 回答
1

在 Visual Basic 中,0False,而任何非零值是True. 此外,根据MSDN

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

于 2013-01-22T15:42:46.987 回答
0

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

于 2013-01-22T15:44:59.180 回答
0

以下是可能的重复:将布尔值转换为整数返回 -1 是否为真?

布尔常量 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 指令的特点有关。

于 2013-01-22T15:42:09.800 回答