在 Java 中修复 "incompatible types: possible lossy conversion from int to byte"
Fixing "incompatible types: possible lossy conversion from int to byte" in Java
我对这里的代码有疑问:
public class Main
{
public static void main(String[] args) {
System.out.println("Hello World\n");
int x = 36;
byte b1 = ((byte) x) & ((byte) 0xff); // it seems it is the part after &, but I have 0xff cast to byte by using (byte)0xff, so not sure where exactly the error is coming from.
System.out.println(b1);
}
}
我不确定是哪个部分导致了以下错误:
incompatible types: possible lossy conversion from int to byte
这是程序输出的错误信息:
要计算 x & y
,其中两个操作数是字节,必须首先将它们提升为 int
值。字节之间没有&
。因此,结果的类型为 int
也就是说,您所写的内容得到了有效的评估,就好像您将其编写为以下内容一样,明确了语言隐含地为您提供的内容:
byte b1 = ((int) (byte) x) & ((int) (byte) 0xff);
只需进行算术运算,然后将结果转换为 byte
。
byte b1 = (byte)(x & 0xff);
Link to Java Language Specification
编辑添加,感谢@rzwitserloot,用 0xff 屏蔽字节值是没有意义的。如果您需要从整数到字节的赋值,只需编写强制转换:
byte b1 = (byte)x;
你似乎很困惑。
你的代码没有意义。取任何数字,计算 & 0xFF
,然后将其存储在一个字节中,始终是一个 noop - 它什么都不做。
你还会得到一个错误,因为 &
本质上总是至少产生一个 int
(它会向上转换任何更小的东西来匹配),所以你试图将一个 int 分配给一个字节.
你想要完成什么?
“我想让我的字节无符号”!
没办法。 Java 没有无符号字节。 java 字节被签名。时期。它可以包含 -128 和 +127 之间的值。出于计算目的,-128 和 255 是 相同的 (它们都是位序列 1111 1111
- 在十六进制中,0xFF
,并且它们在所有相关算法下的行为相同, 虽然在将它们转换为另一种数字类型时确实会变得棘手 int
).
“我只想存255”!
然后使用int
。这是您在 java 代码中看到的大多数 & 0xFF
的来源:当您有一个字节值 java 本质上将其视为有符号,但您希望将其视为无符号且,因此(假设在 java 字节中无法做到这一点),您想将其向上转换为一个包含 unsigned 表示形式的 int。这是如何做到的:
int x = y & 0xFF;
其中 y
是任何字节。
您可能在某处看到了这个并且现在正在尝试应用它,但是将 y & 0xFF
的结果分配给 byte
没有任何意义。您可以将它分配给一个 int
变量,或者只是将它用作进一步计算中的表达式(y & 0xFF
是一个 int
- 确保添加适当的括号,&
可能有意想不到的优先权)。
int x = 36;
byte b1 = ((byte) x) & ((byte) 0xff);
这个实际工作的每一个可以想象的方式都意味着 b1
是......仍然是 36.
我对这里的代码有疑问:
public class Main
{
public static void main(String[] args) {
System.out.println("Hello World\n");
int x = 36;
byte b1 = ((byte) x) & ((byte) 0xff); // it seems it is the part after &, but I have 0xff cast to byte by using (byte)0xff, so not sure where exactly the error is coming from.
System.out.println(b1);
}
}
我不确定是哪个部分导致了以下错误:
incompatible types: possible lossy conversion from int to byte
这是程序输出的错误信息:
要计算 x & y
,其中两个操作数是字节,必须首先将它们提升为 int
值。字节之间没有&
。因此,结果的类型为 int
也就是说,您所写的内容得到了有效的评估,就好像您将其编写为以下内容一样,明确了语言隐含地为您提供的内容:
byte b1 = ((int) (byte) x) & ((int) (byte) 0xff);
只需进行算术运算,然后将结果转换为 byte
。
byte b1 = (byte)(x & 0xff);
Link to Java Language Specification
编辑添加,感谢@rzwitserloot,用 0xff 屏蔽字节值是没有意义的。如果您需要从整数到字节的赋值,只需编写强制转换:
byte b1 = (byte)x;
你似乎很困惑。
你的代码没有意义。取任何数字,计算 & 0xFF
,然后将其存储在一个字节中,始终是一个 noop - 它什么都不做。
你还会得到一个错误,因为 &
本质上总是至少产生一个 int
(它会向上转换任何更小的东西来匹配),所以你试图将一个 int 分配给一个字节.
你想要完成什么?
“我想让我的字节无符号”!
没办法。 Java 没有无符号字节。 java 字节被签名。时期。它可以包含 -128 和 +127 之间的值。出于计算目的,-128 和 255 是 相同的 (它们都是位序列 1111 1111
- 在十六进制中,0xFF
,并且它们在所有相关算法下的行为相同, 虽然在将它们转换为另一种数字类型时确实会变得棘手 int
).
“我只想存255”!
然后使用int
。这是您在 java 代码中看到的大多数 & 0xFF
的来源:当您有一个字节值 java 本质上将其视为有符号,但您希望将其视为无符号且,因此(假设在 java 字节中无法做到这一点),您想将其向上转换为一个包含 unsigned 表示形式的 int。这是如何做到的:
int x = y & 0xFF;
其中 y
是任何字节。
您可能在某处看到了这个并且现在正在尝试应用它,但是将 y & 0xFF
的结果分配给 byte
没有任何意义。您可以将它分配给一个 int
变量,或者只是将它用作进一步计算中的表达式(y & 0xFF
是一个 int
- 确保添加适当的括号,&
可能有意想不到的优先权)。
int x = 36;
byte b1 = ((byte) x) & ((byte) 0xff);
这个实际工作的每一个可以想象的方式都意味着 b1
是......仍然是 36.