在 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.