2

我可能错过了对 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 回答后的评论中所写的那样。

4

3 回答 3

4

Java“字节数据类型是一个 8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)。” 因此,当您将一个字节分配给 +128 时,它实际上会回绕到最低值 -128

有关详细信息,请参阅http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

于 2013-03-17T22:32:24.497 回答
4

String.valueOf 不占用一个字节,它采用以下之一:

boolean char char[] double float int long Object

在您的实现中,您实际上是在调用 String.valueOf(int value) 它实际上并不包含 128 的值。尝试打印

Log.d("Debug", "" + bProblem)

那应该行得通。

编辑 -

我想说的是 String.valueOf 实际上并没有查看字节的值。它正在查看构成字节的相同位作为 int 并打印它。

于 2013-03-17T22:33:48.823 回答
4

在 java 虚拟机中,字节字段 bProblem 将使用一个 int。现在,String.valueOf(int)使用,因为没有字节变体。所以(错误地?)该字段被视为 int,所以无符号,128。


对不起,我尝试实现了 128 但没有成功(Java 7,Linux)

我已经变得偏执了,您使用带有 int 字段 bProblem 的子类。或者更可能是编译的类与未最新编译的 java 源一起使用。也许您可以尝试使用 Eclipse 以外的其他编译器。

于 2013-03-17T22:36:14.493 回答