Vb.net 将布尔值强制转换为整数将返回-1表示真?

Vb.net 将布尔值强制转换为整数将返回-1表示真?,vb.net,boolean,Vb.net,Boolean,我正在使用一些代码,这些代码似乎使用CInt(myBoolean)将布尔值转换为整数。奇怪的是,如果该值为真,则返回-1。例如: CInt(True) // returns -1 CInt(False) // returns 0 这在其他语言中常见吗 我认为布尔值如果为真,则为1,如果为假,则为0。另外,是否有方法使Visual Basic将1赋值为true而不是赋值为-1?通常,false的值由0表示,true的值由任何非0整数值表示。true和false(以及其他)的特定值是您不应该依赖

我正在使用一些代码,这些代码似乎使用
CInt(myBoolean)
将布尔值转换为整数。奇怪的是,如果该值为真,则返回-1。例如:

CInt(True)  // returns -1
CInt(False) // returns 0
这在其他语言中常见吗


我认为布尔值如果为真,则为1,如果为假,则为0。另外,是否有方法使Visual Basic将1赋值为true而不是赋值为-1?

通常,false的值由0表示,true的值由任何非0整数值表示。true和false(以及其他)的特定值是您不应该依赖的—它们可能是特定于实现的。我不确定您想做什么,但最好不要依赖
True
False
具有任何特定整数值,除非您必须这样做

我能找到的关于VB特定行为的最佳解释来自:

布尔常量True具有数值−1.这是因为布尔数据类型存储为16位有符号整数。在这个结构中−1计算为16个二进制1(布尔值为真),0计算为16个0(布尔值为假)。当对返回整数值的16位有符号整数值0执行Not操作时,这一点很明显−换句话说,真=不假。当对整数的各个位(如And、Or、Xor和Not)执行逻辑运算时,这种固有的功能变得特别有用。[4]True的这种定义也与1970年代早期Microsoft BASIC实现以来的BASIC一致,并且还与当时CPU指令的特征有关


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

指定此行为,并用“不要那样做,mkay”之类的注释。请进一步记下:

框架内的转换

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


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

初始使用的解决方法是:

 Dim i As Integer = CInt(Int(False))
这将返回一个0

 Dim i As Integer = CInt(Int(True))
这将返回1。

提供了一些有价值的见解:

布尔值不会存储为数字,存储的值也不会与数字等效。您永远不应该编写依赖于等效数值的True和False代码。只要有可能,您应该将布尔变量的使用限制为其设计的逻辑值


我也有同样的问题,在结果上使用了
数学。Abs
函数:)

1970年代和1980年代的许多BASIC版本都使用
运算符实现了逐位算术,并使真正的条件表达式计算为-1(即“所有位集”)两个补码中的值(用于整数)。我不太清楚为什么决定让真正的条件表达式计算为一个全位的集合值;能够使用
根据条件表达式屏蔽整数可能比乘法快,但考虑到解释器的内部机制,差异会很小


在任何情况下,微软为个人电脑制作的BASIC的第一个版本遵循了一个传统,即真正的条件值为-1(所有位都设置);由于QuickBASIC反过来应该与它们兼容,而VisualBasic应该与QuickBASIC兼容,所以它们使用了相同的表示。尽管.Net将整数和布尔值识别为不同的类型,但VB.Net希望为可能依赖旧行为的VB6程序提供迁移路径。使用“Option Strict Off”,VB.Net将把布尔值True隐式转换为整数-1;虽然大多数程序员对
使用了严格的
选项,但如果
CInt()
的行为与隐式转换行为不同,则会让人感到困惑。

我对其进行了测试,得到了以下结果:

Public Module BooleanTest
Public Function GetTrue() As Boolean
    GetTrue = True
End Function
End Module

这将导致:

1
一,

我希望这能证明.NET中的所有
True
值总是相同的。原因很简单:所有.NET成员都必须相互通信。如果
object.Equals(trueFromCSharp,trueFromVB)
会导致false(就像
trueFromCSharp==trueFromVB
一样),这会很奇怪


CInt
只是一个将
True
转换为
-1
的函数。另一个函数
Int
将返回
1
。但是这些是转换器,并且没有提到任何关于二进制值的内容

MySQL也有同样的问题,因为它没有布尔类型,只有一个tinyint(1)

我的解决方案是编写一个转换器函数,以确保在将值插入数据库之前这些值是正确的

        Public Function BoolToMySql(bVal As Boolean) As Integer
            Dim retVal As Integer
            If bVal = True Then
                retVal = 1
            Else
                retVal = 0
            End If
                 BoolToMySql = retVal
        End Function

我希望这可以帮助其他人在VB.NET中使用Boolean。 正如Roger编写的VB.NET更好的方法一样:

Public Function BoolToMySql(bVal As Boolean) As Integer
   return  If(bVal, 1, 0)
End Function

我刚刚测试了这个premis。VB.NET中的布尔值不等于
-1
,它只等于
1
。我通过使用FieldOffsetAttribute创建一个包含两个重叠字段的结构来检查这一点。这样,您可以看到布尔值的确切二进制值
CInt
只是一种转换。我想,参考旧文档并没有什么帮助。我将
True
传递到一个接受整数的函数中,并在VB.NET中获得值
-1
。在文章Martjin references()中,似乎布尔值的转换方式决定了得到的整数值。我认为应该是
IIf
,而不是
If
…因此:
返回IIf(bVal,1,0)
对我来说不起作用。CInt()返回有符号整数,所以我又得到了-1。可能这是一个旧的解决方案(我使用VBA 7.1)
Public Function BoolToMySql(bVal As Boolean) As Integer
   return  If(bVal, 1, 0)
End Function