Java长比较与转换

Java长比较与转换,java,casting,Java,Casting,我正在编写一段代码,检查特定类型通信的数据包头是否包含所有字段中的有效信息。现在我需要确保一个4字节的字段在最左边的字节中有一个1,在下一个字节中有一个0,我不关心其余的。以下是我试图做到这一点的方式: private static boolean validateCheckSumControl(packetHeader packetHeader) { long mask = 0xC0000000; long control = packetHeader.getControl()

我正在编写一段代码,检查特定类型通信的数据包头是否包含所有字段中的有效信息。现在我需要确保一个4字节的字段在最左边的字节中有一个1,在下一个字节中有一个0,我不关心其余的。以下是我试图做到这一点的方式:

private static boolean validateCheckSumControl(packetHeader packetHeader) {
    long mask = 0xC0000000;
    long control = packetHeader.getControl();
    long masked = mask & control;
    if (masked == 0x80000000) {
        return true;
    }
    System.err.println("Incorrect control field!");
    return false;
}
掩码在前四个字节中有零,然后是两个一位,然后又是零,因此,将其添加到数据包头中的控制字段时,这两个位保持不变,并将其他所有内容设置为零。如果结果不是第五个字节的第一位为1,则打印错误消息并返回false。问题是,即使控制字段恰好包含我将其与之比较的值,此代码也会返回false。但是,如果我用0x80000000l替换0x80000000,它就可以正常工作


所以,我的问题是——为什么Java本身不执行适当的强制转换?或者,如果有,为什么会给出错误的结果?

掩码和值使用整数常量。因为它们表示负整数,所以当它们转换为长值时会得到符号扩展。因此
0xc000000
实际上变成
0xffffffc000000l
0x80000000
变成
0xffffff80000000l
。如果使用
0x8000000L
,则会将其解释为
0x0000000080000000L

掩码和值使用整数常量。因为它们表示负整数,所以当它们转换为长值时会得到符号扩展。因此
0xc000000
实际上变成
0xffffffc000000l
0x80000000
变成
0xffffff80000000l
。如果您使用
0x80000000L
它会被解释为
0x0000000080000000L

我个人强烈选择L作为后缀,因为小写L很容易被误认为是数字“1”。MattCoubrough将其改为更清楚的答案。我个人强烈选择L作为后缀,因为小写L很容易被误认为是数字“1”MattCoubrough将数字“1”更改为更清晰的答案。