为什么在进行逻辑AND时会出现溢出

时间:2017-05-23 19:54:45

标签: vb.net

使用VS2010 VB.net

Dim Register As UInt64 
Register = 12297264199100303880

If (Register And &H3FFF) = &H555 Then ' Get Overflow exception here
     MsgBox("Done")
End If

为什么会发生这种情况并且有解决方法?

3 个答案:

答案 0 :(得分:1)

您的文字值被隐式输入为long(Int64),因为您没有为它们指定类型。我实际上已经将赋值溢出到Register,因为给定的值太长了。要使其工作,只需指定文字值的类型,例如UL为无符号长:

Dim Register As UInt64 
Register = 12297264199100303880UL

If (Register And &H3FFFUL) = &H555UL Then
     MsgBox("Done")
End If

答案 1 :(得分:1)

在这种情况下,转动Option Strict On会很有帮助。如果你这样做,你会立即看到问题所在。问题是文字被解释为IntegerInt32)而不是ULongUInt64)。为了强制将文字解释为ULong值,您需要添加UL类型后缀:

Dim Register As UInt64 
Register = 12297264199100303880UL

If (Register And &H3FFFUL) = &H555 Then ' Get Overflow exception here
     MsgBox("Done")
End If

答案 2 :(得分:0)

我通过以下方式解决了这个问题:

Dim DoneMask As UInt64 = &H3FFF
Dim Register As UInt64 
Register = 12297264199100303880

If (Register And DoneMask) = &H555 Then ' Get Overflow exception here
     MsgBox("Done")
End If

显然VB使用显式数据类型而不是文字

更好
相关问题