繁体   English   中英

Java长时间比较和转换

[英]Java long comparison and 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。 但是,如果我将0x80000000替换为0x80000000l,则效果很好。

所以,这是我的问题-Java为什么不自行执行适当的转换? 否则,为什么会给出错误的结果?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM