gpt4 book ai didi

Java 长比较和转换

转载 作者:行者123 更新时间:2023-11-29 03:20:30 24 4
gpt4 key购买 nike

我正在编写一段代码来检查特定类型通信的数据包 header 是否包含所有字段中的有效信息。现在我需要确保一个 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;
}

掩码的前四个字节为 0,然后是两个 1 位,然后再次为 0,因此将其与数据包 header 中的控制字段保持不变,并将其他所有内容设置为 0。如果结果不是第五个字节的第一位为 1,则打印一条错误消息并返回 false。问题是,即使控制字段包含我与之比较的值,此代码也会返回 false。不过,如果我将 0x80000000 替换为 0x80000000l,它就可以正常工作。

那么,这是我的问题 - 为什么 Java 不自己执行适当的转换?或者,如果是,为什么会给出错误的结果?

最佳答案

您使用整数常量作为掩码和值。由于它们表示负整数,因此在转换为长值时会进行符号扩展。所以 0xC0000000 实际上变成了 0xFFFFFFFFFC0000000L0x80000000 变成了 0xFFFFFFFF80000000L。如果您使用 0x80000000L,它会被解释为 0x0000000080000000L

关于Java 长比较和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23906846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com