左移超过类型宽度¶
ID: java/lshift-larger-than-type-width
Kind: problem
Security severity:
Severity: warning
Precision: very-high
Tags:
- correctness
Query suites:
- java-security-and-quality.qls
用于左移操作的最大移位距离由其左侧的提升类型决定。当提升类型为 int
时,右侧的最低 5 位用作移位距离。当提升类型为 long
时,右侧的最低 6 位用作移位距离。
建议¶
将您移位的任何 int
的数量限制在 0-31 范围内,或在应用左移之前将其强制转换为 long
。
示例¶
以下行尝试将 int
左移 32 位。
long longVal = intVal << 32; // BAD
但是,将 int
左移 32 位等同于将其左移 0 位,即不应用移位。相反,应在应用移位之前将值强制转换为 long
。然后,32 位的左移将起作用。
long longVal = ((long)intVal) << 32; // GOOD
参考¶
Java 语言规范:移位运算符。