比较一个字节的值时遇到了问题。
从理论上讲,以下代码段应该返回true
,但它会返回false
。
public static void main(String [] args) {
byte a = 3;
if (MpegUtil.isSlice(a) == true) {
System.out.print("Yes");
}
else System.out.print("No");
}
public static boolean isSlice(byte ID) {
if (ID >= 1 && ID <= (byte) 0xaf) return true;
else return false;
}
函数isSlice
的作用是:接收一个字节,如果它在1和af(十六进制)之间,它将返回true,如果它不返回值为False。然而,不知怎的,它通过回答false
到3来完成了我的测试。
有没有人知道为什么这个功能不起作用?
编辑: 感谢您删除'byte'强制转换的建议,它确实允许代码运行,但是一旦比较值高于或等于'0x80',结果就会变回错误的'false'。我知道这是因为Java认为要签名的字节(现在我真的很期待Java 8),但是有没有比将条件更改为“更清晰”的版本:
if (ID != 0 && ID >= (byte) 0xaf && ID <= (byte) 0x7f) return true
由于这种情况乍一看似乎没有逻辑,有没有更明显的方法来解决这个问题?
答案 0 :(得分:4)
它不起作用,因为(byte) 0xAF
不是您的想法。尝试打印以下内容,以便您明白:
System.out.println(0xaf); // 175
System.out.println((byte) 0xaf); // -81
为什么(byte) 0xAF
为负?
打印此:
System.out.println(Byte.MAX_VALUE); // 127
一个字节的范围是[-128, 127]
(256个数字),因此如果您将175
投射到byte
,您将获得:
175 - 256 = -81
你也可以试试这个:
System.out.println((byte) 128); // -128
System.out.println((byte) -129); // 127
System.out.println((byte) 256); // 0
答案 1 :(得分:1)
字节用Java签名。将0xaf
强制转换为字节会产生负数。 Java方法是进行int
比较。只需删除字节转换,所有应该开始工作。
同样,如果您需要比较32位无符号数量,您或多或少地被迫使用long
比较。
缺少无符号类型是Java更烦人(非)的功能之一。