Java长期比较和铸造

时间:2014-05-28 08:48:37

标签: java casting

我正在编写一段代码,用于检查特定类型通信的数据包标头是否包含所有字段中的有效信息。现在我需要确保一个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不执行适当的转换本身?或者,如果确实如此,为什么会给出错误的结果呢?

1 个答案:

答案 0 :(得分:4)

您可以使用整数常量作为掩码和值。由于它们表示负整数,因此当它们转换为长值时会得到符号扩展。因此0xC0000000实际上变为0xFFFFFFFFC0000000L0x80000000变为0xFFFFFFFF80000000L。如果您使用0x80000000L,则会将其解释为0x0000000080000000L