当前位置: 首页 > 面试题库 >

Findbugs警告:整数移位32-是什么意思?

终睿
2023-03-14
问题内容

我正在使用Findbugs扫描第三方源代码(为谨慎起见,在集成到我的代码中),然后发现以下警告:

long a = b << 32 | c

错误:整数移位32模式ID:ICAST_BAD_SHIFT_AMOUNT,类型:BSHIFT,类别:CORRECTNESS

该代码将整数移位超出范围0..31的常数。这样的效果是使用整数值的低5位来决定要移位多少。这可能是不希望的,并且至少令人困惑。

谁能解释以上内容的确切含义?

谢谢!(我是Java编程的新手)


问题答案:

根据Java语言规范:

如果左侧操作数的提升类型为int,则仅将右侧操作数的最低5位用作移位距离。就像右侧操作数受到掩码值0x1f的按位逻辑AND运算符&(§15.22.1)一样。因此,实际使用的移动距离始终在0到31(含)范围内。

因此,如果b是一个int,则表达式等于

long a = b | c;

我非常怀疑这是什么目的。应该是

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

(如果b已经很长,则代码是正确的,并且FindBugs将该错误误认为是错误)。



 类似资料:
  • 问题内容: Netbeans给我警告: 从未使用分配的变量 这是什么意思? 问题答案: 这意味着在给该变量赋值之后,您不会对该变量执行任何操作。例如,您不会返回它,使用它执行计算,将它传递给方法或其他任何方法。这基本上意味着在为变量分配值后尚未使用该变量。

  • 在将我的框架迁移到Xcode 10 beta(10L176w)之后,我开始收到如下警告: 将架构arm64映射到x86_64。确保为iOS模拟器平台正确配置了此目标的体系结构和有效体系结构构建设置。 ... 以及: 将体系结构armv7映射到i386。确保已为iOS模拟器平台正确配置此目标的体系结构和有效的体系结构构建设置。 尽管有这些警告,构建和单元测试都通过了。我使用的是Swift 4.2。

  • 问题内容: 我正在使用字符串作为锁,因此想确保该对象是一个新实例。FindBugs抱怨,因为直接定义字符串(使用双引号)通常更有效。我的代码如下: 我在这里做错什么了吗?Eclipse FindBugs插件仍将其报告为问题: 问题答案: 好的,所以尽管其他两个答案都很有趣且有用(两个都是+1),但我并没有最终更改代码,而是要接受自己的答案。为了使FindBugs满意,我将注释从成员变量移到了周围的

  • 问题内容: 我正在尝试将整数右移32,但结果是相同的数字。(例如5。) 如果我尝试对Byte和Short执行相同的操作,则可以使用。例如,“(字节)5 >> 8”为0。 整数有什么问题? 问题答案: JLS 15.19。移位运算符 …如果左侧操作数的提升类型为int,则 仅将右侧操作数的最低5位 用作移位距离。 因此转移是无效的。

  • 本文向大家介绍什么是JavaScript中的警告框?,包括了什么是JavaScript中的警告框?的使用技巧和注意事项,需要的朋友参考一下 警报对话框通常用于向用户发出警告消息。例如,如果一个输入字段要求输入一些文本,但用户未提供任何输入,则作为验证的一部分,您可以使用警报框来发出警告消息。 尽管如此,警报框仍可用于发送更友好的消息。警报框仅提供一个按钮“确定”以选择并继续。 示例 您可以尝试运行

  • 从FindBugs错误描述中考虑以下内容 NP:保证取消引用空值(NP\u guaranted\u DEREF) 有一条语句或分支,如果执行该语句或分支,将保证此时某个值为null,并保证该值被取消引用(在涉及运行时异常的转发路径上除外)。 请注意,如果(x==null)这样的检查抛出新的NullPointerException();被视为x的解引用。 除了在涉及运行时异常的前进路径上是什么意思?