You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原因分析

  1. 整数字面量类型规则:Java中十六进制字面量0xFFFFFFFF和0x00000000FFFFFFFF默认是32位int类型,这个值对应int补码的-1。
  2. 运算时的类型提升:当long类型变量a和int类型掩码做按位与运算时,Java会自动将int掩码提升为long类型。由于原int掩码是负数,提升时会执行符号扩展——高位全部补1,最终变成64位的0xFFFFFFFFFFFFFFFF。
  3. 实际运算结果: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:10:02