我正在处理一些使用 VB.NET 的代码,这些代码似乎是通过 CInt(myBoolean)
将布尔值转换为整数。奇怪的是,如果这个值为 true,则返回 -1。例如:
CInt(True) // returns -1
CInt(False) // returns 0
在其他编程语言中是否也是这样的呢?
我原本认为布尔值表示真时应该是1,假时应该是0。还有,是否有办法让Visual Basic将true赋值为1而不是-1?
通常,false的值用0表示,true的值用任何非0整数值表示。关于true和false的具体值(以及其他值),你不应该依赖它们——它们可能是特定于实现的。我不确定你试图做什么,但最好不要依赖True
或False
具有任何特定的整数值,除非你绝对必须这样做。
我能找到的关于VB的具体行为的最好解释来自于Wikipedia:
布尔常量True的数字值为-1。这是因为布尔数据类型存储为16位有符号整数。在此结构中,-1被评估为16个二进制1(布尔值True),而0被评估为16个0(布尔值False)。当对一个16位有符号整数值0执行Not操作时,这一点很明显,它将返回整数值-1,换句话说,True = Not False。当在整数的各个位上执行逻辑操作(如And、Or、Xor和Not)时,这种固有功能变得特别有用。此定义的True也与自20世纪70年代以来Microsoft BASIC实现相关,并且还与当时CPU指令的特性有关。
您最初使用的一个解决方法是:
Dim i As Integer = CInt(Int(False))
这将返回0。
Dim i As Integer = CInt(Int(True))
这将返回1。我曾经遇到过同样的问题,并使用了 Math.Abs
函数处理结果 :)
Public Module BooleanTest
Public Function GetTrue() As Boolean
GetTrue = True
End Function
End Module
...
[StructLayout(LayoutKind.Explicit)]
struct MyStruct
{
[FieldOffset(0)]
public bool MyBool;
[FieldOffset(0)]
public int MyInt32;
}
static void Main(string[] args)
{
MyStruct b1, b2;
b1.MyInt32 = 0;
b2.MyInt32 = 0;
b1.MyBool = BooleanTest.BooleanTest.GetTrue();
b2.MyBool = true;
Console.WriteLine(b1.MyInt32);
Console.WriteLine(b2.MyInt32);
}
我希望这能证明.NET中所有的1
1
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中处理布尔值。这是一种更好的编写VB.NET代码的方式,与Roger编写的代码相比。
Public Function BoolToMySql(bVal As Boolean) As Integer
return If(bVal, 1, 0)
End Function
IIf
,而不是 If
....所以:return IIf(bVal, 1, 0)
- jbyrd我发现其他答案对我正在处理的VBA特定场景不够完善。这在VB.NET中未经过测试。
我想要在一行代码中将任何不等于0的数字变为1,并将0保持为0,而无需使用If语句。我最终采用的方法是:
Abs(CBool(iCount))
CBool()
函数将给定的数字(如上例中的iCount
)转换为布尔值,将可能的结果缩小为两个值;值为-1
的True
和值为0
的False
。
然后,Abs()
函数取布尔值的绝对值(无负数),以返回False
的0
和True
的1
。
在实践中,以下情况将返回0
:
Abs(CBool(0))
Abs(False)
并且以下返回1
:
Abs(CBool(1))
Abs(CBool(-1))
Abs(CBool(-38473))
Abs(CBool(358677))
Abs(True)
我希望这对于其他人在处理类似情况时有所帮助。
True
传递给一个接受整数的函数,却得到了值为-1
。在Martjin引用的文章(http://msdn.microsoft.com/en-us/library/ae382yt8.aspx)中,似乎你如何转换布尔值决定了你得到的整数值。 - Brian J