Согласно MSDN ulong reference всем вашим целочисленным литералам 1 , 30, 31 рассматриваются как INT:
When an integer literal has no suffix, its type is the first of these types in which its value can be represented: int, uint, long,
Согласно MSDN << operator результатом операции < < также внутр. Когда yo сдвиг на 30, результат положительный, при сдвиге на 31 результат - отрицательный int, который не может быть назначен ulong.
Редактировать: HVD указал мне ошибку в следующем. Спасибо, HVD!
Start Error - При переключении 32 бита, компилятор знает, что вы хотите, ULONG, и, таким образом, результат операции сдвига является положительным длинным, который может быть преобразован в unlong - конец ошибка
правильная причина, почему 1 < < 32 не приводит к ошибке компиляции в предоставленной ссылке для оператора < <:
If the first operand is an int, the shift count is given by the low-order five bits of the second operand. That is, the actual shift count is 0 to 31 bits.
32 в двоичную: 0010 0000; нижний порядок пять бит: 0 0000, поэтому фактический выполненный сдвиг равен 1 < < 0, что приводит к int со значением 1, которое, конечно, может быть присвоено ulong.
Чтобы решить эту проблему, убедитесь, что номер 1 длинный. В этом случае 1 < < 31 остается положительным долго.
You can also use suffixes to specify the type of the literal according to the following rules: If you use L, the type of the literal integer will be either long or ulong according to its size.
Таким образом, 1L является длинным; 1L < < 31 является положительным длинным и, следовательно, может быть присвоено ulong
1 << 31 может быть оценено с помощью операндов int32. Можете ли вы оценить 1л << 31? –
Работы @RegisPortalez (например, непроверенная (...) версия). Есть ли причина для этого? – boboes
@boboes это просто способ по умолчанию, когда C# обрабатывает простые числа. –