在VB.NET中将Boolean转换为Integer

时间:2009-04-13 20:35:13

标签: vb.net

请使用以下代码:

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)

8 个答案:

答案 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转换例程(CTypeCInt)将值转换为整数。因为这样的Visual Basic语义在起作用,返回的值是-1。

下一个有趣的行是Convert.ToInt32()行。这是使用不使用Visual Basic语义的.NET转换例程。相反,它返回基础BCL表示形式的真实布尔值,即1。

答案 1 :(得分:29)

有些语言认为布尔值为-1而不是1.我不得不做研究,看看为什么,我不记得了。

在VB6中,常量True的值为-1

但是,Convert.ToInt32(Boolean)documented返回“如果值为true,则为数字1;否则为0”。这样,无论你使用哪种框架语言都是一样的。

修改:查看问题boolean true -- positive 1 or negative 1

答案 2 :(得分:10)

至于为什么-1用于True,我相信这是因为它是字面意思(不是0)。

从零开始,翻转所有位,然后将其读作二进制补码 - 出现负数。

因此,任何非False都是True,而False是0,(NOT False)用-1表示。

这可能只是巧合,但...... [/ p>

答案 3 :(得分:7)

从MSDN Visual Basic文档:

Type Conversions

  

当Visual Basic转换数字时   数据类型值为布尔值,0变为   错误和所有其他值变为   真正。当Visual Basic转换时   数值类型的布尔值,False   变为0,True变为-1。

对于Convert.ToInt32(value)

  如果值为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 !

整数已签名,T​​rue为整数 - > -1

UInteger是非签名的,真实的UInt - > 1。

等等......

false值清除有符号数字中的最高位,而非有符号数字中最低位。

因此,在所有数字数据类型中,False为0。