将布尔值转换为整数会返回-1表示true?

Bar*_*ker 41 vb.net boolean

我正在使用一些VB.NET代码,似乎是使用一个整数的布尔值CInt(myBoolean).发生的奇怪事情是,如果值为true,则返回-1.例如:

CInt(True)  // returns -1
CInt(False) // returns 0
Run Code Online (Sandbox Code Playgroud)

这在其他语言中常见吗?

我认为布尔值如果为真则为1,如果为假则为0.另外,有没有办法让Visual Basic将1赋值为true而不是赋值-1?

Tho*_*ens 38

通常,值false表示为0,值true表示任何非0整数值.true和false(以及其他)的具体值是您不应该依赖的东西 - 它们可能是特定于实现的.我不确定你要做什么,但最好不要依赖TrueFalse拥有任何特定的整数值,除非你绝对必须这样做.

对于VB的特定行为,我能找到的最佳解释来自维基百科:

布尔常量True的数值为-1.这是因为布尔数据类型存储为16位有符号整数.在此构造中,-1计算为16个二进制1(布尔值为True),0为16 0(布尔值为False).当对16位有符号整数值0执行Not运算时,这将显而易见,该值将返回整数值-1,换句话说,True = Not False.当对整数的各个位执行逻辑运算时,这种固有功能变得特别有用,例如And,Or,Xor和Not.[4] 自20世纪70年代早期的Microsoft BASIC实现以来,True的这一定义也与BASIC一致,并且还与当时CPU指令的特性有关.

  • 我刚试过这个前提.VB.NET中的布尔值不等于"-1",它等于"1".我通过使用FieldOffsetAttribute创建具有两个重叠字段的结构来检查这一点.这样你就可以看到布尔值的确切二进制值.`CInt`只是一种转换.参考旧文档并不能帮助我猜测. (2认同)
  • 我将“ True”传递给了一个接受整数的函数,并在VB.NET中获得了值“ -1”。在文章Martjin参考(http://msdn.microsoft.com/zh-cn/library/ae382yt8.aspx)中,看来如何转换布尔值决定了要获取的整数值。 (2认同)

Mic*_*ins 13

最初使用的解决方法是:

 Dim i As Integer = CInt(Int(False))
Run Code Online (Sandbox Code Playgroud)

这将返回0.

 Dim i As Integer = CInt(Int(True))
Run Code Online (Sandbox Code Playgroud)

这将返回1.

  • 对我不起作用。CInt() 返回有符号整数,所以我再次得到 -1。可能这是一个旧的解决方案(我使用 VBA 7.1) (2认同)

Mar*_*ijn 9

这似乎是一个陷阱,我不知道这种行为的任何其他例子.

http://msdn.microsoft.com/en-us/library/ae382yt8.aspx指定了这种行为,并使用"不要那样做,mkay"排序.请进一步说明:

框架中的转换

System命名空间中Convert类的ToInt32方法将True转换为+1.

如果必须将布尔值转换为数字数据类型,请注意您使用的转换方法.


dba*_*ett 5

MSDN文档提供了一些宝贵的见解:

布尔值不作为数字存储,并且存储的值不等于数字.您永远不应该编写依赖于True和False的等效数值的代码.只要有可能,您应该将布尔变量的使用限制为它们所设计的逻辑值.


小智 5

我有同样的问题,并Math.Abs在结果上使用了功能:)