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]已经是字节,因此不需要将它们转换为字节.
相反,将求和的结果转换为一个字节.
Tay*_*mon 12
在Java中,两个bytes 的总和是int.这是因为,例如,127以下的两个数字可以添加到超过127的数字,并且默认情况下Java int几乎对所有数字都使用s.
要满足编译器,请将以下行替换为:
ars[0] = (byte)(ars[0] + ars[4]);
Run Code Online (Sandbox Code Playgroud)
不久前我遇到了这个问题,并在这里收集了所有发现:http : //downwithjava.wordpress.com/2012/11/01/explanation-to-teaser-2/
我们都知道字节在算术运算期间被转换为整数。但为什么会发生这种情况?因为 JVM 没有为字节定义算术指令。字节类型变量必须通过首先将它们“数字提升”为“int”类型,然后添加来添加。为什么JVM中没有字节类型的算术指令?JVM 规范明确指出:
Java 虚拟机为 int 类型的数据提供了最直接的支持。这部分是因为对 Java 虚拟机的操作数堆栈和局部变量数组的高效实现的预期。它也受到典型程序中 int 数据频率的推动。其他整数类型的直接支持较少。例如,没有字节、字符或短版本的存储、加载或添加指令。