我想知道为什么 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 语言中,“true”将等于 1。
Dim t, f As Integer
t = True
f = False
Console.WriteLine(t) ' -1
Console.WriteLine(f) ' 0
Console.ReadLine()
当您将任何非零数转换为 aBoolean
时,它将评估为True
。例如:
Dim value As Boolean = CBool(-1) ' True
Dim value1 As Boolean = CBool(1) ' True
Dim value2 As Boolean = CBool(0) ' False
但是,正如您所指出的,每当您将 aBoolean
设置为True
aInteger
时,它将评估为 -1,例如:
Dim value As Integer = CInt(CBool(1)) ' -1
这样做的原因是因为-1
它的所有位都等于 1 的有符号整数值。由于 aBoolean
存储为 16 位整数,因此通过简单地不处理所有这些位,而不是仅不考虑最低有效位。换句话说,为了True
be 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
存储-1
为1111111111111111
两个1000000000000001
-补充。将负数存储为二进制补码意味着处理器更容易执行算术运算。它也更安全,因为使用双的恭维,没有办法表示0
为负数,这可能会导致各种混乱和错误。
是大多数语言,数值为 0 为假。其他一切都被认为是真实的。如果我没记错的话,-1 实际上是所有位都设置为 1,而 0 是所有位都设置为 0。我想这就是原因。
在 Visual Basic 中,0
是False
,而任何非零值是True
. 此外,根据MSDN:
当 Visual Basic 将数值数据类型值转换为布尔值时,0 变为 False,所有其他值变为 True。当 Visual Basic 将布尔值转换为数值类型时,False 变为 0,True 变为 -1。
我想回到汇编语言,将条件转换为比较cmp
操作并检查零标志 ( ZF
)。对于真正的表达式,ZF
它不会被提升,而对于错误的表达式,它是。早期的英特尔处理器就是这样,但我不记得 ZilogZ80
和摩托罗拉 8 位处理器是否有相同的约定。
以下是可能的重复:将布尔值转换为整数返回 -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 指令的特点有关。