我正在尝试将Java代码移植到C#,但是遇到了与无符号右移运算符>>>相关的奇怪错误。通常情况下,代码如下:
long l = (long) ((ulong) number) >> 2;
这相当于Java中的:
long l = number >>> 2;
然而,对于您可能认为是Integer.MIN_VALUE
的-2147483648L
的情况,由于将其转换为ulong
会改变数字的语义,因此这将返回与Java中不同的数字,因此我得到了不同的结果。
在C#中,类似这样的事情如何实现?
我希望尽可能保留代码语义,因为它是相当复杂的代码体。
(long) ((ulong) number) >> 2
的示例代码进行移位会产生-536870912
的结果,而将ulong
转换(和移位)用括号包起来(long) (((ulong) number) >> 2)
可以获得4611686017890516992
的结果。编辑:我认为你的第一个示例在移位之前将number
转换为ulong
,然后再转回long
,而我的表达式是先将其转换为ulong
,进行移位,然后再转回long
。 - Chris Sinclair