Java按位与(Bitwise AND)输出不符合预期?求原因解析
Java按位与运算不符合预期输出的原因分析
问题代码及输出
class Main { public static void main(String[] args) { long a = -26000; System.out.printf("%X\n", a); // 期望高32位为0(隐式指定掩码) System.out.printf("%X\n", (a & 0xFFFFFFFF)); // 期望高32位为0(显式指定掩码) System.out.printf("%X\n", (a & 0x00000000FFFFFFFF)); } }
运行输出:
FFFFFFFFFFFF9A70 FFFFFFFFFFFF9A70 FFFFFFFFFFFF9A70
原因分析
- 整数字面量类型规则:Java中十六进制字面量
0xFFFFFFFF和0x00000000FFFFFFFF默认是32位int类型,这个值对应int补码的-1。 - 运算时的类型提升:当long类型变量
a和int类型掩码做按位与运算时,Java会自动将int掩码提升为long类型。由于原int掩码是负数,提升时会执行符号扩展——高位全部补1,最终变成64位的0xFFFFFFFFFFFFFFFF。 - 实际运算结果:
a & 0xFFFFFFFFFFFFFFFF的结果就是a本身,所以三次输出完全一致,和预期的“高32位清零”不符。
解决方法
如果需要保留long值的低32位并清零高32位,需将掩码指定为long类型,即在十六进制字面量后加L后缀:
class Main { public static void main(String[] args) { long a = -26000; System.out.printf("%X\n", a); // 使用long类型掩码,高32位为0,低32位全1 System.out.printf("%X\n", (a & 0xFFFFFFFFL)); } }
修改后输出:
FFFFFFFFFFFF9A70 FFFF9A70
内容的提问来源于stack exchange,提问作者kiner_shah
相关产品推荐
相关产品推荐

