[英]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.