Java Findbugs警告:整数移位32——这是什么意思?

Java Findbugs警告:整数移位32——这是什么意思?,java,findbugs,bit,Java,Findbugs,Bit,我正在使用Findbugs扫描第三方源代码(只是为了在集成到我的源代码之前要小心),发现以下警告: long a = b << 32 | c long a=bEdited:几乎可以肯定的是,问题源于“b”是“int”而不是“long” 在C中,如果“b”是一个整数而不是一个长整数,并且左移32位,则原始值中的所有位都已删除,因此整个表达式的结果将与“C”相同,您将调用未定义的行为,因此任何结果都是允许的。正如Rasmus Faber的评论和选择的答案所指出的那样,Java对事物的定

我正在使用Findbugs扫描第三方源代码(只是为了在集成到我的源代码之前要小心),发现以下警告:

long a = b << 32 | c
long a=bEdited:几乎可以肯定的是,问题源于“b”是“int”而不是“long”

在C中,如果“b”是一个整数而不是一个长整数,并且左移32位,则原始值中的所有位都已删除,因此整个表达式的结果将与“C”相同,您将调用未定义的行为,因此任何结果都是允许的。正如Rasmus Faber的评论和选择的答案所指出的那样,Java对事物的定义是不同的,它对可以移位的最大位数进行超长移位。[这似乎是一种奇怪的处理业务的方式;我可能会在一种有它们的语言中安排一个异常。但是,它是明确定义的,这比定义的确切内容更重要。]在计算表达式时不会发生强制64位的情况;它发生在表达式完成且赋值发生时

对5位的引用是。。。有趣的这意味着,如果你左移48,或者二进制110000,这与左移16是一样的。或者,从以下位置选择“
x:

如果左侧操作数的提升类型为int,则仅将右侧操作数的五个最低阶位用作移位距离。这就好像右侧操作数接受了掩码值为0x1f的位逻辑AND运算符(§15.22.1)。因此,实际使用的移动距离始终在0到31之间(包括0到31)

因此,如果b是int,则表达式与

long a = b | c;
我非常怀疑它的意图。应该是的

long a = ((long) b << 32) | c;

long a=((long)b答案的第一部分不正确。在Jave中,b更正:在C中,当将参数超出范围[0,typewidth-1]的值移位时,行为未定义。例如,来自nvidia和intel的opencl编译器为表达式“b>>32”提供了不同的行为。因此,
int>>32也存在同样的问题(0x100000)==int>>0(0x00000)
?您使用了奇怪的伪语法,但确实如此。