当前位置: 首页 > 知识库问答 >
问题:

修复Java中的“不兼容类型:从int到byte的可能有损转换”

龚勇锐
2023-03-14

我对这里的代码有疑问:

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);
        
    }
}

我不确定究竟是哪个部分导致了以下错误:

不兼容的类型:从整数到字节的可能有损转换

这是程序输出的错误消息:

共有2个答案

司徒池暝
2023-03-14

计算x

也就是说,你写的东西被有效地评估,就好像你把它写成下面一样,明确了语言隐含地给你什么:

byte b1 = ((int) (byte) x) & ((int) (byte) 0xff);

只需做算术运算,然后将结果转换为byte

byte b1 = (byte)(x & 0xff);

链接到Java语言规范

感谢@rzwitserloot,用0xff屏蔽一个字节值是没有意义的。如果你需要从一个整数到一个字节的赋值,只需要写转换:

byte b1 = (byte)x;

师赤岩
2023-03-14

你看起来很困惑。

你的代码没有任何意义。取任意数,计算<代码>

您还会收到一个错误,因为

你想达到什么目的?

不行。Java没有无符号字节。java字节是有符号的。句号。它可以保存-128到127之间的值。出于计算目的,-128和255是相同的(它们都是位序列1111 1111-在十六进制中,0xFF,它们在所有相关算术下的行为相同,尽管将它们转换为另一种数字类型int时确实很棘手)。

然后使用int。这是大多数

int x = y & 0xFF;

其中 y 是任何字节。

您可能在某个地方看到了这一点,现在正在尝试应用它,但将结果赋值为y

int x = 36;
    byte b1 = ((byte) x) & ((byte) 0xff); 

任何可以想象的实际工作方式都意味着b1仍然是……36。

 类似资料: