请使用以下代码:
Sub Main()
Dim i As Integer
Dim b As Boolean
i = 1
b = i
i = b
Console.WriteLine(i)
i = Convert.ToInt32(b)
Console.WriteLine(i)
End Sub
这将打印以下内容:
-1
1
为什么会这样?
(只是一个笑话:)你也可以得到0 ......
Int32.TryParse("True", i)
Console.WriteLine(i)
答案 0 :(得分:44)
你所看到的是一些显示其头脑的遗留代码。
问题的核心是VT_BOOL类型。 Visual Basic 6.0使用VT_BOOL类型(AKA VARIANT_BOOL)作为其布尔值。 VARIANT_BOOL的True用值VARIANT_TRUE表示,其值为-1。在转换为.NET期间,决定在使用Visual Basic转换例程将布尔值转换为Integer值时,将在返回值上维护Visual Basic 6.0语义;它会是-1。
第一次隐式转换发生在b = i行。在引擎盖下,这会执行从整数到布尔值的隐式转换。任何非零值都被视为真,因此结果值为真。
但是,以下代码行正在执行到整数类型的隐式转换。
i = b
在幕后,它使用一个Visual Basic转换例程(CType或CInt)将值转换为整数。因为这样的Visual Basic语义在起作用,返回的值是-1。
下一个有趣的行是Convert.ToInt32()
行。这是使用不使用Visual Basic语义的.NET转换例程。相反,它返回基础BCL表示形式的真实布尔值,即1。
答案 1 :(得分:29)
有些语言认为布尔值为-1而不是1.我不得不做研究,看看为什么,我不记得了。
在VB6中,常量True
的值为-1
。
但是,Convert.ToInt32(Boolean)
为documented返回“如果值为true,则为数字1;否则为0”。这样,无论你使用哪种框架语言都是一样的。
答案 2 :(得分:10)
至于为什么-1用于True,我相信这是因为它是字面意思(不是0)。
从零开始,翻转所有位,然后将其读作二进制补码 - 出现负数。
因此,任何非False都是True,而False是0,(NOT False)用-1表示。
这可能只是巧合,但...... [/ p>
答案 3 :(得分:7)
从MSDN Visual Basic文档:
当Visual Basic转换数字时 数据类型值为布尔值,0变为 错误和所有其他值变为 真正。当Visual Basic转换时 数值类型的布尔值,False 变为0,True变为-1。
如果值为true,则返回数字1; 否则,0。
所以对于你的代码:
i = 1
b = i // b becomes true
i = b // true = -1
Console.WriteLine(i) // i is -1
i = Convert.ToInt32(b) // Convert.ToInt32(true) = 1
Console.WriteLine(i) // i is 1
答案 4 :(得分:2)
那是因为在VB.NET中,默认情况下布尔值为-1表示true,0表示false。我不知道为什么它第二次打印为1,但是......
答案 5 :(得分:2)
“True”是数字数据类型的0值的否定!
非签名类型的非(0)返回1.
对于签名类型,不为(0)返回-1。
我不知道您的代码,也许您的代码第二次执行内部数据转换。
答案 6 :(得分:2)
这是一个狡猾的答案,但是:
Dim b As Boolean
b = False
Dim i As Integer
i = IIf(b, 1, 0)
答案 7 :(得分:1)
所有数值数据类型都可以用作布尔值!结果取决于使用的数据类型。
示例:
Dim i As Byte ' Byte is non-signed!
Dim b As Boolean = True
i = b ' Set first (lowest) bit of i (non-signed byte)
' i is now binary 0000 0001 = 1!
Dim i As SByte ' SByte is signed!
Dim b As Boolean = True
i = b ' Set all bits of i (signed byte)
' i is now FF (binary 1111 1111 = -1 !
整数已签名,True为整数 - > -1
UInteger是非签名的,真实的UInt - > 1。
等等......
false值清除有符号数字中的最高位,而非有符号数字中最低位。
因此,在所有数字数据类型中,False为0。