在VB.NET中将Boolean转换为Byte

时间:2012-02-09 19:19:05

标签: .net vb.net casting

为什么在.NET中向boolean投射byte会产生以下输出?

Code Snippit:

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
  (bool)(1)=真
  (字节)((bool)1)= 255

为什么True(通常称为1的整数表示)在转换为byte时转换为255?

4 个答案:

答案 0 :(得分:12)

VB.NET编译器将其作为缩小转换处理。从10.0 VB.NET规范:

  

缩小转化次数的转换是无法证明总是成功的转化,已知可能会丢失信息的转化,以及跨类型域的转换,这些转换的类型差别很大,值得缩小。以下转化归类为缩小转化次数:

     
      
  • 从布尔值到字节,SByte,UShort,Short,UInteger,Integer,ULong,Long,Decimal,Single或Double。
  •   

来自the docs

  

当Visual Basic将数值数据类型值转换为布尔值时,0变为False,所有其他值变为True。当Visual Basic将布尔值转换为数字类型时,False变为0,True变为-1。

字节未签名,因此您从Two's Compliment获得255。

答案 1 :(得分:5)

.NET中的布尔值True存储为-1,由于Two's Complement

,因此存储为11111111

所以Dim x As Boolean = 1将1转换为布尔值

Dim y As Byte = x将True转换为11111111,等于255

(如果你写了Dim z As Integer = x,z会= -1)

答案 2 :(得分:3)

我所见过的Basic的所有历史版本都支持带有整数的按位布尔运算符,使用了“all-bits-set”,即-1,作为真比较的值。因此,如果一个人想要一个值为9,如果a == b,或者如果没有则为零,则可以使用表达式9 AND (a=b)。虽然C中存在的?:运算符允许更清楚地编码这种行为,但使用-1表示“true”比没有离散布尔类型的语言中的缺点更具实际优势。

虽然vb.net是它自己的语言,与vb6完全不同,但是有很多代码已经从vb6移植到vb.net,并且可能依赖于比较运算符产生所有位集的事实。真。

答案 3 :(得分:1)

如果您想将true转换为1false转换为0,请使用:

Convert.ToByte(Boolean) 

链接到文档Convert.ToByte(boolean)

否则,您将获得实际值-10xFF