2009-04-13 91 views
29

看看下面的代碼:布爾轉換爲整數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) 

回答

43

你看到的是一個有點顯示其頭部遺留代碼。

問題的核心是VT_BOOL類型。 Visual Basic 6.0使用VT_BOOL類型(AKA VARIANT_BOOL)作爲其布爾值。對於VARIANT_BOOL來說,真值是用值爲-1的值VARIANT_TRUE表示的。在轉換爲.NET期間,決定在使用Visual Basic轉換例程將布爾值轉換爲Integer值時,將在返回值上維護Visual Basic 6.0語義;它會是-1。

第一個隱式轉換髮生在b = i行。在這種情況下,這會從整數到布爾值進行隱式轉換。任何非零值被認爲是真實的,因此結果值是真實的。

但是,下面的代碼行將隱式轉換爲整數類型。

在此使用的Visual Basic轉換例程(CTypeCInt)中的一個的值轉換爲整數的罩。由於這種Visual Basic語義正在發揮作用,返回值爲-1。

下一條有趣的線是Convert.ToInt32()線。這是使用不使用Visual Basic語義的.NET轉換例程。相反,它返回的基本BCL表示爲一個真正的布爾值是1.

+4

您可能想要添加一些關於WHY的信息VT_BOOL已被使用,爲什麼它的值是-1。 VB 6只有1組「和」和「或」運算符,它們同時執行邏輯運算和按位運算(大多數語言有2組)。 通過將「和」實現爲「&」,並將字面默認值設置爲-1,從而達到了這一目標。 – 2009-04-13 21:07:48

+0

這種方式「true和x」在任何時候都不爲零,「x」不爲零。 – 2009-04-13 21:08:23

25

一些語言考慮布爾值true爲-1,而不是1.我不得不做研究,看看爲什麼,因爲我不記得。

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

但是,Convert.ToInt32(Boolean)documented返回「數字1,如果值爲真;否則,0」。這樣,無論您使用哪種框架語言,都是一樣的。

編輯:見問題boolean true -- positive 1 or negative 1

+0

一些語言使用`-1`爲TRUE;,因爲它是'0b11111111`,所以每一個位是零的二進制表示的對面,這樣使用一個按位的NOT操作會導致另一個操作。 – mbomb007 2016-05-25 21:09:04

1

,默認情況下是因爲在VB.NET,布爾值是-1表示真,0表示假。我不知道爲什麼它打印爲1秒的時間,但...

7

從MSDN Visual Basic文檔:

Type Conversions

當Visual Basic轉換數字 數據類型值布爾, 0變爲 False,所有其他值變爲 爲真。當Visual Basic將 布爾值轉換爲數字類型時,False 變爲0,True變爲-1。

而對於Convert.ToInt32(value)

retuns數1如果值爲true; 否則,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 
+0

添加這些文檔引用的鏈接,我會upmod。 – 2009-04-13 20:53:58

10

至於爲什麼-1用於真,我相信這是因爲它是字面意思(不是0)。

從零開始,翻轉所有位,然後讀取它作爲二進制補碼 - 出現負值。

因此,因爲任何不是False的是True,並且False是0,所以(NOT False)由-1表示。

這可能只是巧合,雖然....

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 ! 

整數簽訂,真到整型 - > -1。

UInteger是非簽約,真正爲uint - > 1.

等等......

假值清零簽署NUMERICS最高位,最低的非簽約NUMERICS。

因此,在所有數字數據類型中,False都是0。

2

「真」是數值數據類型的0值的否定!

不(0),用於非簽名類型返回1

不適用於簽名類型(0)返回-1。

我不知道你的代碼,也許你的代碼第二次執行內部數據轉換。

1

這是一個狡猾的答案,但:

Dim b As Boolean 
    b = False 
    Dim i As Integer 
    i = IIf(b, 1, 0)