使用Java类型转换添加字节



我正试图在一个字节数组中添加两个值。这是我的代码:

byte[] ars = {3,6,9,2,4};
ars[0] = (byte)ars[0] + (byte)ars[4];
System.out.println( ars[0] );

我在编译时得到这个错误:

Main.java:9: possible loss of precision
found   : int
required: byte
    ars[0] = (byte)ars[0] + (byte)ars[4];
                          ^
1 error

一如既往,我们非常感谢您的帮助。

关闭,但有点关闭。

ars[0] = (byte)(ars[0] + ars[4]);

请记住,ars[0]ars[4]已经是字节,因此不需要将它们强制转换为字节。

相反,将求和的结果强制转换为一个字节。

在Java中,两个byte的和是一个int。这是因为,例如,127以下的两个数字可以与127以上的数字相加,默认情况下,Java对几乎所有数字都使用ints。

为了让编译器满意,将有问题的行替换为:

ars[0] = (byte)(ars[0] + ars[4]);

我刚才讨论了这个问题,并在这里收集了所有的发现:http://downwithjava.wordpress.com/2012/11/01/explanation-to-teaser-2/

我们都知道,在算术运算过程中,字节会被转换为int。但为什么会发生这种情况呢?因为JVM没有为字节定义算术指令。字节类型变量的添加必须先将其"数字提升"为"int"类型,然后再添加。为什么JVM中没有针对字节类型的算术指令?JVM规范明确指出:

Java虚拟机为int类型的数据提供了最直接的支持。这在一定程度上是为了高效实现Java虚拟机的操作数堆栈和局部变量数组。它还受到典型程序中int数据频率的影响。其他积分类型的直接支持较少。例如,存储、加载或添加指令没有字节、字符或短版本。

public static void main(String args[]){
    byte[] ars = {3,6,9,2,4};
    ars[0] = (byte)(ars[0] + ars[4]);
    System.out.println( ars[0] );
}

发生这种情况的原因是java自动将使用字节和短变量的表达式转换为int……这是为了避免潜在的溢出风险。。。。因此,即使结果可能在字节范围内,java也会将表达式类型提升为int

请用以下替换该行

ars[0] = (byte)(ars[0]+ars[4]);
byte[] ars = {3,6,9,2,4};
        ars[0] = (byte) (ars[0] + ars[4]);
        System.out.println( ars[0] );

这会起作用,试试

ars[0] = (byte)(ars[0] + ars[4]);

最新更新