Java字节变量怎么可能是128?

Java字节变量怎么可能是128?,java,android,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)

我可能错过了对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添加到列表时,我注意到这一点: Java.lang.ArrayIndexOutOfBoundsException:长度=256;索引=256

有人能给我一些提示让我明白这一点吗

编辑:

后来,我发现这种情况只发生在英特尔安卓仿真器上,正如我在Joop回答后的评论中所写的那样。

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


有关详细信息,请参阅。

String.valueOf不接受一个字节,它接受以下内容之一:

03-17 21:58:46.590: D/Debug(2130): Before: 128    
03-17 21:58:46.590: D/Debug(2130): After: -128
布尔值 烧焦 字符[] 双重的 浮动 int 长的 反对

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

Log.d("Debug", "" + bProblem)
这应该行得通

编辑--


我想说的是,String.valueOf实际上并不是在看字节的值。在java虚拟机中,字节字段bProblem将使用int。现在,
String。使用valueOf(int)
,因为没有字节变量。因此(错误地?)该字段被视为int,因此无符号,128


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


我已经变得多疑了,你用一个带int字段的子类来解决这个问题。或者更可能是一个已编译的类与一个未进行最新编译的java源一起使用。也许您可以尝试eclipse以外的其他编译器。

byte
无法容纳
128
字节的值
应该介于
-128
127
之间。这是我的理解。String.valueOf(foo.bProblem)如何生成128?我能想到的生成
128
的唯一方法是在
foo.bProblem
前面加一个减号,作为
String.value(-foo.bProblem)
,其中
foo.bProblem==(字节)0x80
。您使用的Java版本是什么?编译器符合性级别是1.6。我将代码更改为Log.d(“Debug”,“Before:”+foo.bProblem),并得到了相同的结果。但是
字节b=(byte)0x80;System.out.println(String.valueOf(b))
打印
-128
?字节变量的哪个值会导致String.valueOf(foo.bProblem)=“128”?valueOf()仅用于显示问题。我真正的问题是不能将foo.b问题添加到列表中。当将类似128的值赋给一个字节时,到-128的转换是隐式的。否则会使整个语言不一致。老实说,我无法重现.foo.bProblem被分配到其他地方的情况,我以相同的方式检查了分配,显示它被分配到了-128(0x80)。假设这个变量在某个我不知道的地方出错了。问题是:一个字节变量如何通过赋值超出其作用域?同样,Eclipse显示它总是-128(0x80)?现在你也让我担心了。