使用VS2010 VB.net
Dim Register As UInt64
Register = 12297264199100303880
If (Register And &H3FFF) = &H555 Then ' Get Overflow exception here
MsgBox("Done")
End If
为什么会发生这种情况并且有解决方法?
答案 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
会很有帮助。如果你这样做,你会立即看到问题所在。问题是文字被解释为Integer
(Int32
)而不是ULong
(UInt64
)。为了强制将文字解释为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使用显式数据类型而不是文字
更好