Java 无法识别某些字节,将它们检测为 int?

Java can't recognize some bytes, it detects them as int?

private static byte [] header = {0x16,0x98,0x01,0x02,0x14,0x01,0x00,0x02,0x10,0x03,0x03};

我已经在 java 程序中初始化了我的字节数组之一。这里 java 显示一个错误, 0x98 需要在外部转换为字节。为什么 java 显示这个值是一个 int 值?以及如何告诉 java 这是一个字节?

byte 的范围从 -128 到 127 (=0x7F)。 (另见 https://www.w3schools.com/java/java_data_types.asp

因此,您可以添加到字节数组的最大十六进制数是 0x7F。下一个值 0x80 可以存储到 int(4 字节)或其他类似 short(2 字节)

编辑:

如果要将 0x98 分配给字节变量,可以将其转换为字节:

byte x = (byte) 0x98;

要打印此无符号值,您可以使用 Byte.toUnsignedInt(x);

System.out.println(x); //will print -104
System.out.println(Byte.toUnsignedInt(x)); //will print 152

在 Java 中,假定数字的类型为 int。所以当你写 0x98 时,它被假定为 int 152。如果你写 0x03,它被假定为 int 3.

字节类型的值范围为 -128 ... 127。您可以毫无问题地将此范围内的任何 int 分配给限制为包含 byte 个变量的变量。

但是数字 152 超出了这个范围,所以你得到错误:

incompatible types: possible lossy conversion from int to byte

您可以编写 (byte)0x98 使其工作。

在 JShell 中:

jshell> 0x98
 ==> 152

jshell> (byte)0x98
 ==> -104

这个问题的简单答案是 0x98 不是一个字节。 Java 个字节是有符号的,范围从 -128 到 +127。 0x98 大于 +127。

但真正的解释是从 Java 根本没有字节文字 的事实开始的。每个整数文字表示一个 int 值或一个 long 值。

那么这是如何工作的呢?

 byte b = 1;

之所以有效,是因为有一个特殊规则允许编译时间常量表达式类型为int分配给 byte 当且仅当 值在 byte 范围内时。所以上面的工作,但是:

byte b2 = 0x98;  // ERROR

被拒绝,因为0x98超出了byte的范围。

同样的规则也适用于数组初始值设定项。