2015-03-03 4 views
1

Этот код успешно компилируется, но вызывает System.OverflowException в Visual Studio 2013 во время выполнения:Почему побитовый оператор AND большого числа ULong с постоянными причинами 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

Максимальное значение ULong - '18446744073709551615', а побитовое И не вызывает превышения значения. Вы должны изменить 'И 1' как' И 1D', так как литерал '1' является целым типом. – mbomb007

+0

Есть ли причина, по которой вы определяете 'Dim a As ULong' и используя символ типа десятичного литерала на RHS вместо' UL'? Info: [Type Characters (Visual Basic)] (https://msdn.microsoft.com/en-us/library/s9cz43ek.aspx) –

+0

@AndrewMorton: Это * Любопытно, но не повлияет на проблему переполнения. –

ответ

2

Результат использования побитового «И» на ULong и Integer «Long» - это ваш первый случай. Переполнение не происходит при присваивании, но в оценке самого выражения «И» оно не вписывается в «Длинный». Результат ULong и ULong - это «ULong» - это ваш второй случай.

Эти значения имеют значение. Литерал «1» по умолчанию имеет значение «Целое число».

Btw, простой способ найти результат для этого - установить опцию Infer On и ввести несколько примеров в VB, например «Dim v = 1 And 2», а затем просмотреть команду компилятора «v» путем зависания над ним.

+0

Как он может не вписываться в «Длинный» в операции «И», если «a И 1» равен 1? –

+0

Значение «a» слишком велико для длинного - VB смотрит на «a И 1» и определяет, что это будет «длинный», - тогда он пытается выполнить эту операцию, но один из «a» переполняет временную «Длинный» экземпляр, возможно, еще до операции «И» (я обновил свой ответ, чтобы немного прояснить это). –

+0

Использование «1UL» решает мою проблему, спасибо. Но эта ошибка была слишком неожиданной после C++/C#. –

Смежные вопросы