为什么具有常量的大ULong数的按位AND运算符会导致OverflowException?

时间:2015-03-03 20:40:59

标签: vb.net bitwise-and overflowexception

此代码编译成功,但在执行期间导致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 变量的三个最重要的位都是零。

1 个答案:

答案 0 :(得分:2)

在ULong和Integer上使用按位'And'的结果是'Long' - 这是你的第一个案例。溢出不会在赋值时发生,但在评估'And'表达式本身时 - 它不适合'Long'。 ULong和ULong的结果是'ULong' - 这是你的第二种情况。

这些价​​值观的类型很重要。文字“1”默认为“整数”。

顺便说一下,找到这些结果的简单方法是设置Option Infer On并在VB中键入一些示例,例如“Dim v = 1 And 2”,然后通过将鼠标悬停在“v”上查看编译器的输入它