此代码编译成功,但在执行期间导致Visual Studio 2013中出现System.OverflowException:
Sub Main()
Dim a As ULong = 14345389830683080345D
Dim c As ULong = 1
Dim x As ULong = a And 1 '<-- cause System.OverflowException
Dim y As ULong = a And c '<-- works well
End Sub
你能解释一下为什么会这样吗?如果 a 变量的值很小(例如5),则不会发生异常。
P.S。 a 变量的三个最重要的位都是零。
答案 0 :(得分:2)
在ULong和Integer上使用按位'And'的结果是'Long' - 这是你的第一个案例。溢出不会在赋值时发生,但在评估'And'表达式本身时 - 它不适合'Long'。 ULong和ULong的结果是'ULong' - 这是你的第二种情况。
这些价值观的类型很重要。文字“1”默认为“整数”。
顺便说一下,找到这些结果的简单方法是设置Option Infer On并在VB中键入一些示例,例如“Dim v = 1 And 2”,然后通过将鼠标悬停在“v”上查看编译器的输入它