2012-02-09 53 views
6

爲什麼在.NET中將boolean轉換爲byte會給出以下輸出?在VB.NET中將布爾轉換爲字節

代碼片段:

Dim x As Boolean = 1 
Dim y As Byte = x 'Implicit conversion here from Boolean to Byte 

System.Diagnostics.Debug.Print(_ 
    "x = " & x.ToString _ 
    & " y = " & y.ToString _ 
    & " (bool)(1) = " & CType(1, Boolean).ToString _ 
    & " (byte)((bool)1) = " & CType((CType(1, Boolean)), Byte).ToString) 

輸出:

X =真
Y = 255
(布爾)(1)= TRUE
(字節)((布爾)1 )= 255

爲什麼True(w通常被稱爲1)的整數表示1)在轉換爲byte時轉換爲255?

+0

我覺得很奇怪VB.NET甚至可以讓你將一個布爾值轉換爲一個字節。在C#中這是非法的演員。 – vcsjones 2012-02-09 19:25:26

+0

如果你在VB.NET中做了一個'DirectCast()',它會自動告訴你這是一個非法的強制轉換,但是如果你使用'CType()'(我已經展示過),它將按照上面的方式進行。我很想知道'True'這個通常被稱爲'1'的情況,轉化爲'255'。很多奇怪的鑄造在這裏進行。 – afuzzyllama 2012-02-09 19:30:06

+0

我認爲這只是編譯器的行爲。它發出IL'ldc.i4 FF 00 00 00',但我在規範中看不到任何說明原因的內容。對於非常簡單的情況,編譯器只是優化演員陣容。 – vcsjones 2012-02-09 19:30:42

回答

11

的VB.NET編譯器將它作爲一個縮小便利着想rsion。從10.0 VB.NET規範:

縮小轉換是無法證明始終成功的轉換,已知可能會丟失信息的轉換以及跨類型的轉換,這些轉換的類型差別很大,值得收窄表示法。下面的轉換屬於收縮轉換:

  • 從布爾值,字節,爲SByte,USHORT,短,UInteger,整型,烏龍,長,小數,單,或雙精度。

the docs

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

字節沒有簽名,所以你得到255而不是Two's Compliment

4

True在.NET的一個布爾值被存儲爲-1,而這又是11111111由於Two's Complement

所以Dim x As Boolean = 1轉換1到布爾值真

Dim y As Byte = x true轉換11111111,它等於255

(相反,如果你寫Dim z As Integer = x,Z會= -1)

3

基本的所有歷史版本我已經看到哪些支持具有整數的按位布爾運算符已經使用「全部位集」,即-1作爲真比較的值。因此,如果有人希望a = b的值爲9,否則爲零,可以使用表達式9 AND (a=b)。儘管C中的操作符允許這樣的行爲被更清晰地編碼,但是在沒有離散佈爾類型的語言中,使用-1作爲「真」具有比缺點更多的實際優點。

雖然vb.net是它自己的語言,與vb6完全分開,但有很多代碼已經從vb6移植到vb。並且可能依賴於比較運算符在真實時產生全比特集的事實。

0

如果你想true轉換爲1false0,使用方法:

Convert.ToByte(Boolean) 

鏈接到文檔Convert.ToByte(boolean)

否則喲得到實際價值-1,0xFF