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

Why bitwise AND operator of big ULong number with constant causes 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 变量的三个最高有效位全部为零。

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

这些值的类型很重要。文字 '1' 默认为 'Integer'.

顺便说一句,找到这些结果的一种简单方法是设置 Option Infer On 并在 VB 中键入一些示例,例如 "Dim v = 1 And 2",然后查看编译器对 [=23 的键入=] 将鼠标悬停在上面。