我正试图将Java代码移植到C#中,但我遇到了与无符号shift right运算符有关的奇怪错误>>>通常代码:
long l = (long) ((ulong) number) >> 2;
long l = number >>> 2;
这样的事情在C#中怎么可能呢?
我希望尽可能地保留代码语义,因为它是一个相当复杂的代码体。
我相信你的表达在考虑C#的顺序优先级时是不正确的。我认为您的代码正在将long
转换为ulong
,然后返回到long
,然后进行移位。我假设您的意图是在Ulong
上执行移位。
根据C#规范§7.2.1,一元(或在您的情况下,铸造操作)优先于移位。因此,您的代码:
long l = (long) ((ulong) number) >> 2;
将被解释为:
ulong ulongNumber = (ulong)number;
long longNumber = (long)ulongNumber;
long shiftedlongNumber = longNumber >> 2;
long l = (long) (((ulong) number) >> 2);
ulong ulongNumber = (ulong)number;
ulong shiftedulongNumber = ulongNumber >> 2;
long longShiftedNumber = (long)shiftedulongNumber;
将号
指定为-2147483648L
,则生成4611686017890516992
。
编辑:注意,给定这些排序规则,在我的回答中有一组额外的括号,这是不必要的。正确的表达式可以写成:
long l = (long) ((ulong) number >> 2);
简单的问题:为什么如果我在Java中对字节变量应用无符号右移(也是短的),它就像int一样威胁它: 控制台输出:
问题内容: 无符号右移运算符在最左边插入0。所以当我这样做 输出 因此,它将在最左边的位中插入0。 输出 不应该是0吗? 问题答案: 参见http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19 如果左侧操作数的提升类型为int,则仅将右侧操作数的最低5位用作移位距离。就像右侧操作数受到掩码值0x1f(0b1111
D的答案等于C。但E的安瑟是正确的。我想不出原因。 谢谢
你将得到一个由n个整数组成的数组,包括负整数和正整数。你需要把数组分成正数和负数。将数组的所有正整数添加到一个数组(或任何数据结构)中,并将所有负整数添加到另一个数组(或任何数据结构)中。如果输入数组的第一个元素是正数,则在第一行输出中按给定顺序打印所有正数,然后在第二行输出中按给定顺序打印所有负数,反之亦然。 注意事项: 将0视为正数。 输出中的正数和负数应遵循给定数组中元素的顺序。输出的每一行
本文向大家介绍C语言中无符号数和有符号数之间的运算,包括了C语言中无符号数和有符号数之间的运算的使用技巧和注意事项,需要的朋友参考一下 C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了。 unsigned int和int进行运算 直接看例子来说明问题吧 输出结果为: 这是因为a和b进行比较的时
在我的系统中,在二进制(十进制255)中是(预期是8位字符)1111 1111。 类似地,如预期的0111 1111。左边填满了一个零。 是预期的1000 0000。 例如,现在我想生成未签名的字符0010 0000。 我尝试了,但输出1110 0000....怎么了?为什么左边突然被一个塞满了? 如何生成启用第N位(从左侧开始)的? 我想 此刻,正在给我 对于、存在此问题,但对于或更高版本不再发