为什么不能将(1 << 31)分配给ulong变量? (错误25常数值…无法转换…) - c#

为什么这种分配会产生可编译错误:Constant value '-2147483648' cannot be converted to a 'ulong',在这种情况下我必须使用unchecked (...)

ulong xDummy30 = (1 << 30); // works
ulong xDummy31 = (1 << 31); // ERROR 25 Constant value '-2147483648' cannot be converted to a 'ulong'
ulong xDummy32 = (1 << 32); // works

而是使用此方法:

ulong xDummy31a = unchecked((ulong)(1 << 31));
// or
ulong xDummy31b = (1ul << 31); //  comment from Regis Portalez

编辑
问题Why do I have to cast 0 (zero) when doing bitwise operations in C#?具有相似的答案,并且观察到的行为的原因相同。但是它们是不同的问题。

参考方案

根据MSDN ulong reference,您所有的整数文字1、30、31都被视为int:

当整数文字没有后缀时,其类型是可以表示其值的这些类型中的第一个:int,uint,long,

根据MSDN << operator,<<操作的结果也是一个整数。当yo偏移30时,结果为正,当yo偏移31时,结果为负int,不能将其分配给ulong。

编辑:HVD在下面指出了一个错误。谢谢HVD!

起始错误-移位32位时,编译器知道您需要ulong,因此移位操作的结果为正long,可以将其转换为unlong-结束错误

1 << 32不会导致编译器错误的正确原因是在提供的指向运算符<<的链接中:

如果第一个操作数是整数,则移位计数由
第二个操作数的低五位。也就是说,实际的转变
计数为0到31位。

32到二进制:0010 0000;低位五位:0 0000,因此实际执行的移位为1 << 0,这将导致int的值为1,当然可以将其分配给ulong。

要解决此问题,请确保您的数字1很长。在这种情况下,1 << 31仍为正长。

您还可以根据以下规则使用后缀指定文字的类型:
如果使用L,则根据其大小,文字整数的类型将为long或ulong。

所以1L很长1L << 31是正长,因此可以分配给ulong

Java中的“ <<”运算符 - java

最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…

LeetCode题解拼凑硬币

小Q十分富有,拥有非常多的硬币,小Q拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好各有两个面值为2^k的硬币,所有小Q拥有的硬币就是1,1,2,2,4,4,8,8.....小Q有一天去商店购买东西需要支付n元钱,小Q想知道有多少种方案从他拥有的硬币中选取一些拼凑起来恰好是n元(如果两种方案某个面值的硬币选取的个数不一样就考虑为不一样的方案)输入:输入包…

Python lmfit约束:a <b <c - python

我在Python中使用lmfit来拟合一些数据,其中包括拟合变量a,b和c。我需要确保a <b <c。我发现http://cars9.uchicago.edu/software/python/lmfit_MinimizerResult/constraints.html谈到需要定义为不等式和设置虚拟变量的约束。例如,如果我想要a + b <=…

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

LeetCode题解爱丽丝和鲍勃

爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:选出任一 x,满足 0 < x < N 且 N % x == 0 。用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两…