为什么在.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?
答案 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
所以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
转换为1
和false
转换为0
,请使用:
Convert.ToByte(Boolean)
链接到文档Convert.ToByte(boolean)。
否则,您将获得实际值-1
,0xFF
。