使用类型转换添加字节,Java

Fig*_*aki 8 java arrays casting type-conversion

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

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

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

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

任何帮助一如既往地非常感谢.

edt*_*ird 12

关闭,但有点偏.

ars[0] = (byte)(ars[0] + ars[4]);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是因为100(一个字节)+ 100(另一个字节)是200,这不是一个字节(在Java中,字节是从-128到127).明确的演员表示可以扔掉"溢出". (5认同)

Tay*_*mon 12

在Java中,两个bytes 的总和是int.这是因为,例如,127以下的两个数字可以添加到超过127的数字,并且默认情况下Java int几乎对所有数字都使用s.

要满足编译器,请将以下行替换为:

ars[0] = (byte)(ars[0] + ars[4]);
Run Code Online (Sandbox Code Playgroud)

  • 我不认为你的回答的推理是有效的。两个 `int` 的总和也可以超过 `Integer.MAX_VALUE`。然而,`int a = Integer.MAX_VALUE + 1` 不会给出编译时错误,而 `byte a = 1 + 1` 会给出编译时错误。这完全是由于 JVM 的设计,在 JVM 规范第 2.11.1 节中指定,其中的细节对很多人来说太技术性了 (2认同)

Abh*_*wal 5

不久前我遇到了这个问题,并在这里收集了所有发现:http : //downwithjava.wordpress.com/2012/11/01/explanation-to-teaser-2/

我们都知道字节在算术运算期间被转换为整数。但为什么会发生这种情况?因为 JVM 没有为字节定义算术指令。字节类型变量必须通过首先将它们“数字提升”为“int”类型,然后添加来添加。为什么JVM中没有字节类型的算术指令?JVM 规范明确指出:

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