Java字节变量怎么能是128?

时间:2013-03-17 22:23:53

标签: java android

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

3 个答案:

答案 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。