我可能会错过对Java中字节的一些基本理解。以下是应用程序的简化摘录,用于说明问题:
public class Foo
{
byte b1;
byte b2;
byte bProblem;
}
foo是Foo的一个实例。以下几个小时困扰我:
Log.d("Debug", "Before: " + String.valueOf(foo.bProblem));
if (foo.bProblem != (byte) 0x80) {
foo.bProblem = (byte) 0x80;
Log.d("Debug", "After: " + String.valueOf(foo.bProblem));
}
LogCat显示以下内容:
03-17 21:58:46.590: D/Debug(2130): Before: 128
03-17 21:58:46.590: D/Debug(2130): After: -128
Eclipse的调试器总是为foo.bProblem显示-128(0x80)。这意味着调试器无法看到String.valueOf()显示的内容。 Java字节怎么能是128?
在将foo.bProblem添加到List时,我注意到了这一点: Java.lang.ArrayIndexOutOfBoundsException:length = 256;指数= 256
有人能提供一些暗示让我理解这个吗?
编辑:
我后来发现这只发生在英特尔Android模拟器上,就像我在Joop的回答后的评论中写的那样。
答案 0 :(得分:4)
Java“字节数据类型是一个8位带符号的二进制补码整数。它的最小值为-128,最大值为127(含)。”因此,当您将字节分配给+128时,它基本上会回绕到最低值-128
有关详细信息,请参阅http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html。
答案 1 :(得分:4)
String.valueOf不占用一个字节,它采用以下之一:
布尔 烧焦 炭[] 双 浮动 INT 长 对象
在您的实现中,您实际上是在调用String.valueOf(int value) 它实际上不包含值128.尝试打印
Log.d("Debug", "" + bProblem)
这应该有效。
编辑 -
我想说的是String.valueOf实际上并没有查看字节的值。它正在查看构成字节的相同位作为int并打印它。
答案 2 :(得分:4)
在java虚拟机中,字节字段bProblem将使用int。现在,使用String.valueOf(int)
,因为没有字节变体。所以(错误地?)该字段被视为int,所以无符号,128。
对不起,我试图达到128但没有成功(Java 7,Linux)
我已经变得偏执,你使用带有int字段bProblem的子类。或者更有可能的是,编译的类与java源一起使用而不是最新的编译。也许你可以尝试另一个编译器而不是eclipse。